在Jason对依赖注入与服务位置的回答中:
右:
public Foo(Bar bar) { this.bar = bar; }
下面的句子是真的吗?
使用IoC框架作为StructureMap或Unity的意义在于,我们可以进行
-
依赖注入
public Foo(container->GetInstance(IBar)) { this.bar = bar; }
哪个比做更好
-
服务定位器
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
的依赖关系。