Вопрос в том, является ли обход IContainer анти-паттерном?
Это зависит от его использования. Внедрение зависимостей PP & P описывает (в §5.2 ), что поставка компонентов приложения за пределы Composition Root с доступом к неограниченному набору изменчивых зависимостей является анти-паттерном, называемым Сервисный локатор .
В вашем случае интерфейс IContainer
позволяет получить доступ к неограниченному набору зависимостей. Это связано с тем, что метод Resolve<T>
позволяет разрешать любые типы. Это делает интерфейс IContainer
кандидатом на то, чтобы стать сервис-локатором. Однако используется ли в качестве локатора службы, зависит от того, как он используется.
В книге очень точно определен локатор службы как шаблон, примененный «вне корня композиции», поскольку ссылка на контейнер или любую такую абстракцию в корне композиции не вызывает таких же недостатков.
Другими словами, вы можете ввести IContainer
в свой класс, например, MessageHandler
, если эта реализация определена внутри корня композиции приложения. Это сделало бы MessageHandler
инфраструктурным компонентом.