2010-01-12 2 views
20

У меня есть 2 проекта.Циркулярные зависимости

Проект № 2 имеет ссылку на проект № 1

Теперь мне нужно ссылаться на проект № 2 в Project # 1, но vs.net жалуется на круговой зависимости.

Есть ли выход из этого?

+2

По крайней мере, мы все договорились о нашем ответе .. ;-). +1 всем – David

ответ

52

Абсолютно нет. Циклические зависимости являются показателем плохого дизайна. Я не хочу быть суровым. Из этого есть некоторые способы.

1) Вы можете реорганизовать общий код для другого проекта, скажем, проект # 0

2) Вы можете исправить свой дизайн, который, вероятно, путь.

У дяди Боба есть хорошая статья о принципах упаковки, которая включает в себя принцип ациклических зависимостей. http://www.objectmentor.com/resources/articles/granularity.pdf. Прочтите это, чтобы узнать, почему циклические зависимости - это плохо.

+1

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

+0

+1 для связанной статьи. Я разделил свой пакет «Logger», который включал в себя набор классов «Журнал использования приложений» и класс «Журнал ошибок» на два отдельных пакета (большинству пакетов не нужно регистрировать использование приложений!), А затем связал тот, который был WAS обратный к оригиналу. Вернуться в DAG. Должно потребоваться чтение для всех. – DFTR

+0

@kyoryu Вы говорите о Принципе инверсии зависимостей (DIP), который он упоминает в статье? - Я согласен, вы, вероятно, должны попытаться найти ПОЧЕМУ потенциал для круговой зависимости и, возможно, изменить элементы дизайна (если можете) до того, как они будут в зависимости от абстракций. – DFTR

5

Объедините два в один или перепроектируйте.

4

№ Строить свои проекты должным образом. Попробуйте использовать какой-то порядок, основанный на абстракции - от низкого до высокого уровня.

5

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

+0

И если им нужно быть на разных языках? – Joshua

+0

Можете ли вы привести пример? –

+0

[Пример устаревших:] В VS 2008 только VB .NET может использовать фильтры исключений, в то время как только C# может использовать выражения Linq. Не сложно представить себе случай, когда они появляются в конфликтующих настройках. – Joshua

10

Реорганизовать ваши проекты, чтобы вывести общие элементы в «Проект № 0», которые являются ссылками как на проект № 1, так и на проект №2.

2

Я действительно не значит быть умным-сельдь, но лучше дизайн программы является ответом.

3

Круговая зависимость означает, что это уже не два независимых проекта (потому что там невозможно построить только один из них).

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

3

Циклическая ссылка может быть сделано, как показано в previous question, но вы не должны делать это по причинам, все уже было сказано здесь.

1

Это, кажется, дефект дизайна, ничего больше. Реконструкция - это решение.

-4

Я не думаю, что это хорошее решение, но все же мы можем сделать, выполнив следующие действия

  • добавить ссылку
  • просматривания и
  • идти в Debug папку дллов проекта
  • найти .dll и Добавить.
+2

не делаем это! Следуйте указаниям, которые указаны в принятом ответе! –