public class A
{
private IClassDependency _foo;
// внедрение через конструктор
public A(IClassDependency foo)
{
_foo = foo;
}
// внедрение через метод
public void Method(IMethodDependency bar)
{
bar.DoSmth();
}
}
public class A
{
private IClassDependency _foo;
// внедрения нет. Зависимость от IClassDependency разрешается через контейнер
public A()
{
_foo = Container.Get<IClassDependency>;
}
}
服务定位器会导致类依赖关系被隐藏。这样,类A就不会向客户显示依赖于什么IClassDependency。而且,所有或几乎所有类都开始依赖于容器。因此,服务定位器通常称为设计反模式。为了防止 DI 容器成为服务定位器,应限制其使用。
DI(依赖注入)——依赖注入。如果一个类或方法依赖于另一个类,那么它会使用构造函数或方法参数从外部接收此依赖关系(C# 中的示例):
类本身不负责创建对象。
DI容器是一个依赖解析容器。用于确定依赖抽象背后的具体类型。每次都将特定的类注册为容器中的
ConcreteClassDependency
权限。IClassDependency
当我们需要它时,IСlassDependency
容器会创建一个实例ConcreteClassDependency
,自动解决所创建的类的依赖关系。服务定位器是使用类中的依赖关系解析容器来检索其依赖关系:
服务定位器会导致类依赖关系被隐藏。这样,类
A
就不会向客户显示依赖于什么IClassDependency
。而且,所有或几乎所有类都开始依赖于容器。因此,服务定位器通常称为设计反模式。为了防止 DI 容器成为服务定位器,应限制其使用。