Являются ли сервисные локаторы не просто глобальными переменными / состоянием? - PullRequest
3 голосов
/ 11 июня 2009

Для того, чтобы отделить код, вы можете иметь сервисный локатор, но разве это не то же самое, что глобальные переменные / состояние?.

Я знаю, что они часто работают за пределами интерфейсов, поэтому вы передаете интерфейс и получаете конкретный класс, но мой вопрос остается в силе.

Например:

class Something {

    void DoSomething() {
        IMyType myType = ServiceLocator.GetSerivceTypeOf(IMyType);
    }
}

Здесь класс требует MyType, который создается где-то еще, но вместо передачи MyType через цепочки (через конструкторы и т. Д.) Он получается таким образом.

Я задавал этот вопрос в начале своей профессиональной карьеры в качестве разработчика - до этого я не сталкивался с этой моделью. Энтони прибил мое мнение (и, следовательно, сейчас выбранный ответ) к локатору услуг - на самом деле я вижу их как анти-паттерны, как и другие. Предоставленные ссылки являются хорошей отправной точкой - но, чтобы ответить на мой собственный вопрос после всего этого времени, они действуют как глобальное состояние, и их следует избегать. Предпочитаю стандартное внедрение зависимостей;)

Ответы [ 3 ]

3 голосов
/ 11 июня 2009

Служба имен, которая обычно выполняет резервное копирование шаблона поиска служб, действительно использует глобальное пространство имен.

Однако необходимо учитывать причины, по которым «глобальные переменные» считаются плохими. Многие из них вращаются вокруг возможности изменять глобальную переменную в любом месте программы. Однако большинство служб именования могут ограничивать модификации привязанного объекта. Сам объект может быть неизменным.

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

2 голосов
/ 12 февраля 2010

Да, это глобальные переменные. Сложные, но они все еще имеют те же основные недостатки. По этой причине внедрение зависимостей является предпочтительным.

Для более подробного обсуждения альтернативы внедрения конструктора см. Также вопрос В чем разница между шаблонами внедрения зависимостей и поиска служб?

И другие веб-страницы Синглтоны - это патологические лжецы и Шаблон внедрения зависимости

1 голос
/ 11 июня 2009

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

Вы можете изменить аргумент. Если вам нужен доступ к сервису в вашем приложении, какой шаблон вы бы использовали для доступа к нему, без привязки к конкретной реализации. Существует не так много альтернатив.

Некоторые ресурсы по сути являются «глобальными» для вашего приложения, например, операционная система, файловая система, система управления окнами, ...

Дискуссия более философская, чем решение проблем. В любом случае, надеюсь, это поможет.

...