Должны ли потребители ServiceLocator вызывать ServiceLocator.Current? - PullRequest
1 голос
/ 06 июля 2010

Я пытаюсь изменить свой код для использования Common Service Locator . У меня есть общая библиотека, которая используется некоторыми другими компонентами.

Что я не понимаю, так это то, что эти компоненты должны вызывать ServiceLocator.Current и разрешать их типы? В таком случае, как я могу убедиться, что ServiceLocator.Current действительно установлен? Должен ли я создать свой собственный MyServiceLocator и добавить статический конструктор? (Это, кажется, лишает смысла стандартизированную абстракцию)

Или в моей общей библиотеке должен быть класс, который предоставляет все разрешимые типы в качестве открытых свойств, тем самым сохраняя ServiceLocator полностью внутренним по отношению к общей библиотеке? (что означало бы наличие абстракции поверх абстракции поверх абстракции)?

Дело в том, что Компоненты не создаются через DI и должны вызывать Контейнер, чтобы получить все, что им нужно.

1 Ответ

3 голосов
/ 07 июля 2010

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

Кшиштоф Козьмич недавно опубликовал хороший обзор , как следует использовать DI-контейнер .В его примерах используется Castle Windsor, но вы можете экстраполировать его на любой DI-контейнер, а также на Common Service Locator.Однако, если вы будете следовать этим принципам, Common Service Locator станет избыточным .

...