解释使用 IoC 容器时"Dependency Injection vs Service Location"



在Jason对依赖注入与服务位置的回答中:

右:

public Foo(Bar bar) 
{
this.bar = bar; 
}

下面的句子是真的吗?

使用IoC框架作为StructureMap或Unity的意义在于,我们可以进行

  1. 依赖注入

    public Foo(container->GetInstance(IBar)) 
    {
    this.bar = bar; 
    }
    

    哪个比做更好

  2. 服务定位器

    public Foo(Container container) 
    {
    this.bar = container->GetInstance(IBar); 
    }
    

依赖注入的要点是,您可以执行

public Foo(IBar bar) 
{
this.bar = bar; 
}

并且将类CCD_ 1与CCD_。然后,您可以使用StructureMap、Unity或20多个依赖项注入容器中的任何其他容器来配置要为每个契约(=接口,可选地加上名称(使用的类或实例,并让DI容器解析所有依赖项。

这样做是因为它允许您通过模拟类Foo的依赖关系来有效地对其进行单元测试。您通常不会自己显式地注入依赖项。

在我看来,依赖注入通常效果最好,如果您只将其作为一次性使用的话。也就是说,在应用程序开始时解析主应用程序服务,包括其所有依赖项,然后在应用程序运行时使用初始化的服务对象网络。

您避免使用服务定位器(这是您的第二个代码示例(,因为1。它将您与一个特定的DI容器和2。您正在隐藏对IBar的依赖关系。

最新更新