Зачем нужен Service Locator?

Ссылка скопирована
1 ответ

Вобще зачем такой не удобный и не лучший способ внедрение зависимостей через GetService()? Не легче ли внедрение делать через конструкторы?

Дополнительно:

Случаев использования много. В некоторых без него не обойтись.
Например:
- Зависимость необязательна
- Есть множество реализаций, а не 1
- Отложенное создание

Если не хочешь использовать - не используй

  • В перечисленных вами случаях обойтись-то как раз можно:
    - используйте тип Зависимость? вместо Зависимость
    - используйте тип IEnumerable<Зависимость> вместо Зависимость и выбирайте нужную
    - используйте IOptionsSnapshot<Зависимость>: объект зависимости будет создаваться в момент обращения и жить только в рамках ограниченной области (т.е., по-простому - во время обработки одного запроса).

    Но места, где без Service Locator не обойтись, таки есть: либо они лежат вне области применимости фреймворков, либо (зачастую) там, где не получается что-то сделать чисто через конструктор и требуется передать делегат.

    Но, таки да, теоретики говорят, что Dependency Injection - хорошо, Service Locator - плохо. Правда, потом может случиться, как с "четыре" и "две" - вместо "плохо" станет "лучше". К примеру, на моей памяти с комментариями так и случилось.

Не легче ли внедрение делать через конструкторы?

А вы не задумывались над тем, кто и как будет разрешать зависимости для конструкторов?
В нынешнем ASP.NET Core этим занимются каркасы приложений ("фрейворки", от английского framework). И делают они это как раз через контейнер сервисов (либо напрямую через GetService, либо через ActvatorUtilities).
Но есть области в ASP.NET Core , которые фремворками не закрываются - наример, в конвейере обработчиков запроса (middleware), там где требуется делегат типа RequestDelegate. И там без прямого обращения к контейнеру сервисов не обойтись.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Никита Орлов Ответ

Service Locator - это шаблон проектирования, который используется для управления зависимостями в приложении. Он представляет собой объект, который содержит ссылки на различные сервисы или компоненты приложения и предоставляет методы для получения этих сервисов.

Одной из основных причин использования Service Locator является упрощение управления зависимостями в приложении. Вместо того чтобы явно создавать и передавать зависимости в каждый компонент, можно использовать Service Locator для централизованного хранения и получения сервисов.

Service Locator также обеспечивает гибкость и удобство при работе с зависимостями. При необходимости можно легко заменить сервис на другой или добавить новый сервис без необходимости изменения кода во всех компонентах приложения.

Преимущества использования Service Locator:

1. Централизованное управление зависимостями.
2. Гибкость при работе с зависимостями.
3. Возможность легкого замещения или добавления новых сервисов.
4. Упрощение тестирования компонентов приложения.

Пример использования Service Locator на языке PHP:

class ServiceLocator {
    private $services = [];
 
    public function addService($name, $service) {
        $this-&gt;services[$name] = $service;
    }
 
    public function getService($name) {
        if (isset($this-&gt;services[$name])) {
            return $this-&gt;services[$name];
        } else {
            throw new Exception("Service not found: " . $name);
        }
    }
}
 
$serviceLocator = new ServiceLocator();
$serviceLocator-&gt;addService('userService', new UserService());
 
$userService = $serviceLocator-&gt;getService('userService');

class ServiceLocator { private $services = []; public function addService($name, $service) { $this-&gt;services[$name] = $service; } public function getService($name) { if (isset($this-&gt;services[$name])) { return $this-&gt;services[$name]; } else { throw new Exception("Service not found: " . $name); } } } $serviceLocator = new ServiceLocator(); $serviceLocator-&gt;addService('userService', new UserService()); $userService = $serviceLocator-&gt;getService('userService');

Таким образом, использование Service Locator может значительно упростить управление зависимостями в приложении, обеспечивая гибкость и удобство при работе с сервисами.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно