2

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

1 Answers1

2

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-контейнер не стал сервис-локатором его использование следует ограничить.

Cost
  • 922
  • Спасибо за ответ, а не могли бы Вы немного пояснить последнюю фразу: "Чтобы DI-контейнер не стал сервис-локатором его использование следует ограничить." – S.H. Mar 07 '24 at 17:30
  • @S.H., Имел в виду, что использовать контейнер следует только там, где происходит конфигурирование запускаемой задачи. Это может быть точка входа в программу, начало обработки нового запроса к сервису и т.д. Использование контейнера после завершения конфигурирования задачи приведёт к сервис-локатору – Cost Mar 08 '24 at 16:04