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

Explain "Dependency Injection vs Service Location" when using IoC containers

Jason's answer to Dependency Injection vs Service Location中:

Right:

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

并将 class FooBar class 分离。然后使用 StructureMap、Unity 或 20 多个依赖注入容器中的任何其他容器来配置要为每个合约使用哪个 class 或实例(=接口,可选加上名称)并让 DI 容器解析所有依赖项.

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

在我看来,依赖注入通常效果最好,如果你只将它用作一次性的东西。也就是说,您在应用程序开始时解析您的主要应用程序服务,包括其所有依赖项,然后在应用程序 运行.

时使用初始化的服务对象网络

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