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

Не совсем понимаю чем конкретно отличаются эти понятия, был бы благодарен за разъяснение.


Ответы (1 шт):

Автор решения: Cost

DI (Dependency Injection) - внедрение зависимостей. Если класс или метод зависит от другого класса, то эту зависимость он получает откуда-то извне, используя аргументы конструктора или метода (пример на C#):

public class A
{
   private IClassDependency _foo;
   
   // внедрение через конструктор
   public A(IClassDependency foo)
   {
       _foo = foo;
   }
   
   // внедрение через метод
   public void Method(IMethodDependency bar)
   {
       bar.DoSmth();
   }
}

сам класс не отвечает за создание объектов.

DI-контейнер - контейнер разрешения зависимостей. Используется для определения того, какой конкретный тип скрывается за абстракцией зависимости. Зарегистрировав в контейнере конкретный класс ConcreteClassDependency как разрешение IClassDependency, всякий раз. когда нам понадобится IСlassDependency контейнер создаст экземпляр ConcreteClassDependency, автоматически разрешив зависимости создаваемого класса.

Сервис-локатор - это использование контейнера разрешения зависимостей внутри классов для получения их зависимостей:

public class A
{
   private IClassDependency _foo;
   
   // внедрения нет. Зависимость от IClassDependency разрешается через контейнер
   public A()
   {
       _foo = Container.Get<IClassDependency>;
   }
}

Сервис-локатор приводит к скрытию зависимостей класса. Так класс A не показывает клиентам, что зависит от IClassDependency. Более того, все или почти все классы начинают зависеть от контейнера. Поэтому часто сервис-локатор называют антипаттерном проектирования. Чтобы DI-контейнер не стал сервис-локатором его использование следует ограничить.

→ Ссылка