两种模式似乎都是控制反转原理的一种实现。也就是说,对象不应该知道如何构造其依赖项。
依赖注入(DI)似乎使用构造函数或setter来“注入”它的依赖项。
使用构造函数注入的示例:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo(IBar bar)
{
this.bar = bar;
}
//...
}
Service Locator似乎使用了一个“容器”,它连接了它的依赖项并给foo它的标志。
使用服务定位器的示例:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo()
{
this.bar = Container.Get<IBar>();
}
//...
}
因为我们的依赖关系只是对象本身,所以这些依赖关系具有依赖关系,后者甚至具有更多的依赖关系,依此类推。因此,控制容器(或DI容器)的反转诞生了。示例:温莎城堡,Ninject,结构图,弹簧等)
但是,IOC / DI容器看起来完全相同像一个服务定位器。称它为DI容器是一个坏名字吗?IOC / DI容器仅仅是服务定位器的另一种类型吗?当我们有很多依赖项时,我们主要使用DI容器是否存在细微差别?