Ваш проект библиотеки классов вообще ничего не должен знать о внедрении зависимостей. Вместо этого вам следует убедиться, что каждый класс принимает все свои зависимости в конструкторе следующим образом:
public void MyClass(IMyDependency dependency)
Это работа для того, что называется Composition Root
, чтобы гарантировать, что все решается сверху. Например. в случае ASP.NET это будет сама инфраструктура, которая будет вызывать Resolve
для получения Controller
и составления всего дерева объектов, где ваш класс будет иметь прямую или косвенную зависимость от контроллера.
Этот принцип имеет причудливое название "Голливудский принцип": не звоните нам, мы вам звоним. Если вы разрешите зависимость самостоятельно (то есть «позвоните им»), то вы делаете что-то, что вызывает Service Locator
, которое считается антипаттерном. Таким образом, вместо этого вы полагаетесь, что кто-то (то есть «вас зовут») внедрит правильную зависимость в ваш класс в некоторой начальной точке входа.
Кроме того, любой дизайн библиотеки классов, которая знает о контейнере DI, в будущем может привести ко многим проблемам, например, если вы захотите, например. проведите модульное тестирование, смените DI-контейнер и т. д. Поэтому вам лучше всего ничего не знать о контейнере.
P.S. Сама Microsoft на самом деле допустила ошибку, когда объединила множество библиотек с контейнером DI (IServiceCollection
). Например. библиотеки журналов, фабрика HTTP и т. д. все полагаются на этот контейнер DI для выполнения работы, что делает почти невозможным переключение на другой.
Я понимаю, что это будет намного проще для кого-то использовать его, не понимая DI слишком хорошо, но в долгосрочной перспективе это действительно ограничивает вас и делает, например, модульное тестирование более громоздко.