Использование Common Service Locator вне основного проекта - PullRequest
0 голосов
/ 19 февраля 2012

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 19 февраля 2012

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

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

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

0 голосов
/ 20 февраля 2012

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

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

...