2009-12-02 2 views
0

Другими зависимостями я имею в виду абстрактные классы и все остальное.Где должны быть интерфейсы и другие зависимости в C#?

У меня есть проект в виде dll, которому необходимо определенное interface, IInput. Для тестового проекта также нужен этот интерфейс, поэтому я поместил этот интерфейс в свой основной проект, который, в свою очередь, является отдельной сборкой exe.

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

У меня никогда не было этой проблемы раньше, и я не знаю, как лучше ее противостоять. В качестве временного исправления я переместил интерфейс в отдельную DLL, но очень скоро мне понадобится его в основном проекте, чтобы я вернулся на квадрат.

Edit:

Я хотел бы упомянуть, дизайн, так что здесь идет.

Menu 
Menu Tests 
Runner 

Меню имеет IInput, который на самом деле является адаптером интерфейса для сторонней библиотеки, чтобы обеспечить единичное тестирование.

Таким образом, меню необходимо для ввода, но так будет и бегун. Проект runner (exe) потребует ввода, поэтому мне понадобится IInput снова.

ответ

6

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

MySolution 
|->Interfaces.dll 
|->MainProject.exe (references Interfaces.dll) 
|->TestProject.exe (references Interfaces.dll) 
+0

Это то, о чем я думал, но я никогда не слышал о единственной сборке только для пары интерфейсов. – Finglas

+0

Я обычно использую проект «BusinessEntities» и поддерживаю любые интерфейсы там, будь то пара или большое количество. Работает хорошо. –

2

Почему не создать структуру, как это:

Solution 
    + Project With Interface 
    - IInput 
    + Main Project/UI 
    -> Reference "Project With Interface" 
    + Test Project 
    -> Reference "Project With Interface" 

нет циклических ссылок, и это действительно прямо вперед на опорном использования.

1

Круговая зависимость указывает на проблему с вашим дизайном. Интерфейс должен идти туда, куда принадлежит его определение. Если у вас есть два взаимозависимых проекта, они, вероятно, либо принадлежат одному проекту, либо (более вероятно) - если ваша dll является «реальной» библиотекой, в которой ваш основной проект использует, - тогда поместите интерфейс в dll.

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

0

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

0

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

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

/Klaus

Смежные вопросы