这两种模式似乎都是控制反转原则的一种实现方式。也就是说,一个对象不应该知道如何构造它的依赖。
依赖注入(DI)似乎使用构造函数或设置器来“注入”它的依赖关系。
Constructor Injection的示例:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo(IBar bar)
{
this.bar = bar;
}
//...
}
服务定位器似乎使用一个“容器”,它连接它的依赖项并为foo提供它的栏。
使用服务定位器的示例:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo()
{
this.bar = Container.Get<IBar>();
}
//...
}
由于我们的依赖关系本身就是对象,这些依赖关系又有依赖关系,而这些依赖关系又有更多的依赖关系,依此类推。因此,控制反转容器(或 DI 容器)应运而生。例如:Castle Windsor、Ninject、Structure Map、Spring 等。但是,IOC/DI容器看起来与服务定位器完全相同。将其称为DI容器是一个不好的命名方式吗?IOC/DI容器只是另一种类型的服务定位器吗?微妙之处在于我们通常在具有许多依赖项时使用DI容器。