@returnZero

В чём разница между DI, DI-контейнером и сервис-локатором?

Не совсем понимаю чем конкретно отличаются эти понятия, был бы благодарен за разъяснение.
  • Вопрос задан
  • 200 просмотров
Решения вопроса 1
AshBlade
@AshBlade
Просто хочу быть счастливым
DI, Dependecy Injection - это сам процесс внедрения зависимостей (например, когда ты зависимости через конструктор получаешь)
Пример:
class User
{
    IService _service;
    
    // DI
    User(IService service)
    {
          _service = service;
    }
}


DI-Container - это специальный контейнер, который может необходимую зависимость предоставить. Сначала ты в него регистрируешь все зависимости, а потом вызываешь метод по типу .getService("UserService") и он сам понимает какой сервис ты хочешь, какая у него реализация и как его создать (возможно для него нужны другие зависимости)
Пример
// DI-контейнер
var container = new DependencyContainer();
container.Register(typeof(IService), new ConcreteService());

var service = container.Get<IService>();


Сервис-локатор - это (анти) паттерн, когда, грубо говоря, у тебя есть статический класс этого DI контейнера, к которому обращаются все сервисы. Т.е. вместо того, чтобы использовать тот же самый DI или передавать интерфейс DI контейнера они напрямую обращаются к конкретному DI-контейнеру. Так делать не надо - будут трудности с тестированием, обновлением и всем сопутствующим
Пример
// Сервис-локатор
class ServiceRegistry
{
     IService Service;
     static IService GetService()
     {
           return Service;
     }
}

class User
{
     void DoSomething()
     {
           var service = ServiceRegistry.GetService();
           service.MakeStuff();
     }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
delphinpro
@delphinpro
frontend developer
DI - Внедрение зависимостей.
DI-container – хранилище зависимостей
Service Locator - механизм, обеспечивающий неявное извлечение "зависимости" (то есть некоторого объекта) из хранилища зависимостей.
Ответ написан
@sergeevVasily
Думаю в том, что DI-контейнер может по типу параметра (типу параметра в конструкторе или методе) сам подставить необходимый объект (используя рефлексию), а сервис-локатор так не умеет. Из-за этого DI-контейнер можно использовать как сервис-локатор, а наоборот - нельзя.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы