2015-03-20 2 views
0

Итак, мой вопрос: я получил, например, два класса, перекрестные ссылки друг на друга. Я хочу скомпилировать эти файлы для разделения файлов DLL.Есть ли способ скомпилировать несколько файлов C# в несколько assebly с циклической зависимостью?

Файл 1:

public class A 
{ 
    public B bObj; 

    public A() 
    { 
     bObj = new B (this); 
    } 

    public void TestMethod() 
    { 

    } 
} 

Файл 2:

public class B 
{ 
    public B (A aObj) 
    { 
     aObj.TestMethod(); 
     aObj.bObj.CallMyself(); 
    } 

    public void CallMyself() 
    { 

    } 
} 

Я хочу, чтобы быть в состоянии разделить только части проекта с другими людьми, что они работают. Они должны быть в состоянии проверить это, поэтому они должны скомпилировать проект. Есть ли волшебное решение, которое можно легко автоматизировать? Решение должно работать с любым файлом, я знаю, как разрешить круговую зависимость с третьей сборкой.

EDIT: Как я уже говорил, я знаю, как решить такую ​​ситуацию. Я просто написал неприятный пример, чтобы показать, что я хочу создать решение, которое может иметь дело с любым кодом.

+0

Это не выглядит правильным ... –

+1

Что-то серьезно не так с этой логикой; Это, безусловно, пример проблемы XY. У вас есть неизвестная * проблема *, которая привела вас к решению конструктивного решения *, которое включает в себя круглые ссылки. Вместо того, чтобы спрашивать, как решить * проблему *, вы спросили, как сделать * решение * простым в использовании, за исключением того, что это решение является одним из худших концепций дизайна, которые вы когда-либо могли себе представить. http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem/66378#66378 – Claies

+0

Я согласен с @Claies. Вы должны следовать советам Эшли Фризе о создании интерфейсов для своих классов и заглянуть в [Dependency Injection] (http://en.wikipedia.org/wiki/Dependency_injection). –

ответ

4
  • Вкомпилировать B.dll с class B изменен, чтобы удалить зависимость от
  • Compile A.DLL с B.dll и class A в зависимости от B
  • RECOMPILE B.DLL с полной class B

Если интерфейсы классов не изменяются, вы можете перекомпилировать только один без источника другого.

Если вы идете по этому маршруту - нет.

+2

Плюс один * Если вы идете по этому маршруту - нет. * –

+0

Если я удалю зависимость от B до A, конструктор в этом случае будет пуст, поэтому A не сможет построить тип B с типом параметра A. – aagocs

+0

@aagocs вам может потребоваться сделать больше итераций до тех пор, пока вы не будете полностью привязаны ... или сократите конструкторы цикла, чтобы принять «объект», поэтому в подписях классов нет зависимостей ... Я действительно надеюсь, что вы это сделаете мстить кому-то, а не пытаться улучшить и упростить код. :) –

1

Короткий ответ: не делайте этого. В этой ситуации принято распространять общие интерфейсы в отдельной библиотеке, которые каждый может видеть, поэтому они могут программировать эти интерфейсы, не затрагивая друг друга, а затем помещать личные вещи в отдельные сборки, которые полагаются на первое.

E.g.

// myproject.interfaces.dll 
interface IA 
{ 
    void Process(IB b); 
} 

interface IB 
{ 
    void Process(IA a); 
} 

// myproject.A.dll - depends on myproject.interfaces.dll 
class A : IA 
{ 
    .... 
} 
Смежные вопросы