разделяемая библиотека определяет интерфейс IBar как общедоступный, а класс Bar - как внутренний, поэтому API не может выполнить регистрацию
Давайте на минуту рассмотрим это проектное решение.Хотя никакие внешние абоненты не могут создать объект Bar
, они могут создать объект IBar
:
IWindsorContainer container = new WindsorContainer();
SharedLibrary.RegisterDependancies(container);
IBar bar = container.Resolve<IBar>();
Существуют различные причины для сохранения класса Bar
internal
, но поскольку вы уже можете запускать код, подобный приведенному выше, почему бы просто не позволить общей библиотеке предоставить фабрику?
IBar bar = SharedLibrary.CreateBar();
Это было бы намного проще и отделило бы разделяемую библиотеку от контейнера.В целом, это лучший совет, который я могу дать относительно Dependency Injection и многоразовых библиотек: используйте шаблоны Dependency Injection, а не контейнеры.См. Мою статью DI-Friendly Library для получения более подробной информации.
Если вы все еще хотите использовать DI-контейнер в своем хост-проекте (например, проекте Wep API), вы можете зарегистрироваться IBar
противэтот статический метод фабрики.
Внутренние классы
Существуют законные причины, по которым можно хотеть сохранить некоторые классы internal
, но я часто вижу базы кода, где классы internal
, по непонятным причинампричина.Мой опыт работы с кодом C # на протяжении десятилетий заключается в том, что случаи, когда классы internal
без веской причины, значительно перевешивают случаи, когда есть веская причина.
Действительно ли Bar
должен быть внутренним?Почему?
Из OP ясно, что IBar
реализуется Bar
.Этот может быть артефактом сведения вопроса к основам (хорошая работа, делая это, кстати), но у меня складывается впечатление, что Bar
- это only класс, который реализует IBar
,Так ли это?
Если это так, класс Bar
должен предоставлять методы, определенные IBar
.Таким образом, API класса уже общедоступен, так зачем скрывать класс?Таким образом, единственное, что скрыто, это конструктор ...
Идеальный шторм
Иногда, когда я даю совет, подобный приведенному выше, я получаю ответ, что вопрос не в этом.было около.Вопрос в том, как изменить образ жизни Виндзорского замка (кстати, , вы можете ).
С другой стороны, этот вопрос - почти идеальный (маленький) шторм, который иллюстрирует, почемуповторно используемые библиотеки не должны зависеть от DI-контейнеров:
- Библиотека должна использоваться в нескольких контекстах (веб, консоль, рабочий стол и т. д.)
- Библиотека зависит от CastleWindsor
- Интерфейсы общедоступны, но классы реализации не являются
Это усложняет ситуацию - отсюда и вопрос о переполнении стека.
Мой лучший совет - сохранитьвсе просто.Удаление зависимости от Castle Windsor сделает разработку и повторное использование библиотеки проще, а не сложнее.
Было бы еще проще использовать библиотеку, если вы сделаете большинство библиотечных классов общедоступными.