使用IoC容器时说明“依赖注入与服务位置”

时间:2018-08-06 13:08:34

标签: c# dependency-injection inversion-of-control service-locator

Jason's answerDependency Injection vs Service Location中:

  

右:

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); 
    }
    

1 个答案:

答案 0 :(得分:3)

依赖注入的重点是您可以做到

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

,将类FooBar类解耦。然后,您可以使用StructureMap,Unity或20多个依赖注入容器中的任何其他容器来配置要用于每个协定的哪个类或实例(=接口,可以选择加上名称),然后让DI容器解析所有依赖关系。

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

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

您避免使用服务定位器(这是第二个代码示例),因为1.它会将您绑定到特定的DI容器,并且2.您将对IBar的依赖项隐藏了。