Куда должны идти интерфейсы и другие зависимости в C #? - PullRequest
0 голосов
/ 02 декабря 2009

Под другими зависимостями я имею в виду абстрактные классы и все остальное.

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

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

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

Изменить:

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

Menu
Menu Tests
Runner

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

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

Ответы [ 5 ]

6 голосов
/ 02 декабря 2009

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

MySolution
 |->Interfaces.dll
 |->MainProject.exe (references Interfaces.dll)
 |->TestProject.exe (references Interfaces.dll)
2 голосов
/ 02 декабря 2009

Почему бы не настроить структуру следующим образом:

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

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

1 голос
/ 02 декабря 2009

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

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

0 голосов
/ 02 декабря 2009

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

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

/ Klaus

0 голосов
/ 02 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...