В чём разница между DI, DI-контейнером и сервис-локатором?
Не совсем понимаю чем конкретно отличаются эти понятия, был бы благодарен за разъяснение.
Ответы (1 шт):
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-контейнер не стал сервис-локатором его использование следует ограничить.