Вы, вероятно, могли бы решить эту проблему с помощью DI, но вы не должны .
Если я правильно понимаю, у вас есть что-то вроде этого:
+ Assembly A + Assembly B
| |
+-- Interface IFoo +-- Class ConcreteFoo : IFoo
| ^
+-- Class MyClass -->------->-------|
Другими словами, вы пытаетесь получить MyClass
для ссылки на ConcreteFoo
, но не можете, потому что сборка B
, в которой находится ConcreteFoo
, уже зависит от IFoo
в A
.
Это ошибка проектирования. Если вы объявляете интерфейс IFoo
в сборке A
, но без конкретных реализаций, тогда любые другие интерфейсы / классы в сборке A
должны только ссылка IFoo
, никогда конкретный класс, который его реализует.
Существует три способа устранения круговой зависимости:
Сделать MyClass
зависимым от IFoo
вместо ConcreteFoo
. Это, вероятно, лучший вариант, если вы можете это сделать. Если проблема заключается в том, что вам нужен физический экземпляр IFoo
для использования в MyClass
и вы не знаете, где его получить, тогда пусть в конструкторе будет IFoo
- пусть тот, кто использует фигуру MyClass
что IFoo
использовать.
Переместите интерфейсы в их собственную сборку. Это все еще достаточно хорошая практика. Ваш дизайн будет выглядеть так:
+ Assembly App + Assembly Interfaces + Assembly Concrete
| | |
| +-- Interface IFoo |
| | \ |
+-- Class MyClass | \------+-- Class ConcreteFoo
| | | ^
+---- Member Foo ->--------------------->-------------------|
Переместить MyClass
в свою сборку. По сути, ваше дерево зависимостей будет выглядеть так же, как в # 2 выше, но если сборка A
намного меньше, чем B
, тогда это потребует меньше усилий.
Надеюсь, это поможет.