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