Использование Common Service Locator вне основного проекта

Я недавно сделал переход от StructureMap к Ninject. Все было гладко, пока я не понял, что у Ninject нет версии ObjectMactory (сервисного локатора) StructureMap.

Я обнаружил Common Service Locator, который предоставляет шаблон Service Locator для любого контейнера IOC, включая Ninject. Он отлично работает внутри моего проекта запуска, например, WebSite. Но если я пытаюсь получить доступ к ServiceLocator.Current из подпроектов, например, Core или Data, кажется, что CommonServiceLocator не знает ни о одном из моих сопоставлений зависимостей.

Как мне использовать Common Service Locator из подпроекта?

NB. Мне известны дебаты о ServiceLocator как о паттерне / анти-паттерне. Я обнаружил, что существует компромисс между ServiceLocator как анти-паттерном и Anemic Domain Model как анти-паттерном - иногда его гораздо проще и проще использовать в качестве локатора сервиса.

2 ответа

Используйте фабрики вместо прямого доступа к контейнеру. Это освобождает ваше приложение от определенного контейнера и предотвращает использование сервисного локатора.

Единственные ситуации, когда вам нужно получить доступ к ядру, - это когда-то в корне вашей композиции, и в некоторых очень редких ситуациях, когда вы не контролируете создание объекта. В этих ситуациях вы все равно можете назначить ядро ​​одноэлементному объекту или использовать ServiceLocator, чтобы сделать его доступным из любого места.

ServiceLocator является статическим объектом. Поэтому нет никакой разницы, откуда вы к нему обращаетесь. Я предполагаю, что вы обращаетесь к ServiceLocator до того, как он полностью настроен.

Не вступая в дискуссию об использовании сервисного локатора, пробовали ли вы этот пакет NuGet http://www.nuget.org/packages/CommonServiceLocator.NinjectAdapter?

Когда я решаю, что хочу один, это то, что я использовал.