Использование 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?
Когда я решаю, что хочу один, это то, что я использовал.