Для того, чтобы отделить код, вы можете иметь сервисный локатор, но разве это не то же самое, что глобальные переменные / состояние?.
Я знаю, что они часто работают за пределами интерфейсов, поэтому вы передаете интерфейс и получаете конкретный класс, но мой вопрос остается в силе.
Например:
class Something {
void DoSomething() {
IMyType myType = ServiceLocator.GetSerivceTypeOf(IMyType);
}
}
Здесь класс требует MyType, который создается где-то еще, но вместо передачи MyType через цепочки (через конструкторы и т. Д.) Он получается таким образом.
Я задавал этот вопрос в начале своей профессиональной карьеры в качестве разработчика - до этого я не сталкивался с этой моделью. Энтони прибил мое мнение (и, следовательно, сейчас выбранный ответ) к локатору услуг - на самом деле я вижу их как анти-паттерны, как и другие. Предоставленные ссылки являются хорошей отправной точкой - но, чтобы ответить на мой собственный вопрос после всего этого времени, они действуют как глобальное состояние, и их следует избегать. Предпочитаю стандартное внедрение зависимостей;)