По этой причине был разработан проект Common Service Locator . Это абстракция над DI-фреймворками, и он определяет интерфейс, очень похожий на ваш IoC
класс. Я даже разработал библиотеку Simple Service Locator ; библиотека DI, которая является прямой реализацией интерфейса Common Service Locator.
Так что в этом смысле не странно иметь абстракцию над структурами DI. Однако при правильном (и полном) выполнении Dependency Injection идея состоит в том, чтобы соответствующим образом настроить дизайн приложения, настроить контейнер в корне приложения и, желательно, иметь только одно место в приложении, где собраны типы (читай: были GetInstance
называется). Для приложения ASP.NET MVC это будет ControllerFactory
. Для приложения ASP.NET WebForms обычно требуется переопределить PageHandlerFactory .
Когда вы играете по этим правилам, нет смысла использовать такую абстракцию, потому что вы все равно просто вызываете контейнер в одном месте вашего приложения. Однако, если это невозможно для вас, в качестве альтернативы можно использовать Common Service Locator или собственную абстракцию.
Но, пожалуйста, сделайте шаг назад, прежде чем вы решите позволить своему коду зависеть от абстракции над вашей библиотекой IoC, потому что это вызывает много проблем и рассматривается как анти-шаблон в целом. Перезвоните в контейнер из вашего кода:
- Делает код намного сложнее для тестирования.
- Скрывает зависимости, делая код труднее для чтения и обслуживания.
- Отключает поддержку во время компиляции.
- Запрещает проверку графиков зависимостей с помощью инструмента.