Шаблон локатора службы и DDD - PullRequest
2 голосов
/ 20 февраля 2012

У меня есть структура с уровнем данных DDD, который использует шаблон локатора службы. Однако в настоящее время я использую глобальный статический класс ServiceLocator, в котором хранятся все ссылки. Я хотел бы преобразовать это в правильную реализацию, где классы реализуют интерфейс IServiceProvider и где я удаляю глобальный статический класс ServiceLocator.

Теперь почти везде нет необходимости расширять существующие классы с помощью интерфейса IServiceProvider, за исключением классов сущностей. Проблема в том, что я думаю, что для классов сущностей очень странно реализовывать IServiceProvider, но мне нужен способ доступа к поставщику услуг, чтобы иметь возможность разрешать хранилища через мой контейнер IoC.

Каков наилучший способ реализации шаблона локатора службы без необходимости реализации IServiceProvider на моих объектах?

Ответы [ 2 ]

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

Сервисный локатор лучше всего использовать в сочетании с контейнером инверсии управления, таким как Unity, Castle Windsor или NInject.См. http://commonservicelocator.codeplex.com/wikipage?title=Unity%20Adapter&referringTitle=Home&ProjectName=commonservicelocator для примера локатора службы, который работает с Unity.

И помните, что локатор службы можно рассматривать как антипаттерн - его следует использовать очень осторожно.Вместо этого гораздо лучше использовать конструктор или внедрение свойства.Но в тех случаях, когда зависимости очень сильно зависят от выполняемой функциональности, у Service Locator есть место.

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

Какого черта объект (бизнес-объект) выставляет IServiceProvider?Это бизнес-объект, а не услуга.И IServiceProvider даже не для сервисов, это механизм IOC для раскрытия сервис-провайдеров.

В любом случае, ваша ORM / инфраструктура / среда выполнения бизнес-объектов - это сервис-провайдер, но не отдельные сущности.

позвольте мне ответить на вопрос: я не вижу какой-либо разумной концепции программирования, в которой сущности открывают IServiceProvider для начала.

--- update

Сервисы должны предоставлять только локатор сервисов - и вы должныИмеется.Вы можете использовать статические переменные потока для тех случаев, когда определенные потоки обращаются к элементам (например, имя: пользовательский интерфейс - к элементам пользовательского интерфейса должен обращаться спецификация из потока пользовательского интерфейса), что нарушает глобальный синглтон.

...