Dependency injection 服务定位和依赖注入之间的实际区别是什么?

Dependency injection 服务定位和依赖注入之间的实际区别是什么?,dependency-injection,inversion-of-control,service-locator,Dependency Injection,Inversion Of Control,Service Locator,我在前面的讨论中详细讨论了服务定位器和依赖项注入器之间的区别,但我仍然无法理解这一点。 我能在没有任何代码的情况下得到一般响应吗?如果使用服务定位器,通常意味着您明确要求某个对象为您创建另一个对象,这通常被视为反模式。 依赖注入是另一种方式 假设你有一个叫做战士的职业,这个职业有武器。 使用服务定位器,您可以向服务定位器询问战士构造器中的武器。 使用依赖注入,武器将被注入到战士的构造函数中,而无需您明确要求它。此代码示例应用以下原则: public类用户服务:IUserService { 私有I

我在前面的讨论中详细讨论了服务定位器和依赖项注入器之间的区别,但我仍然无法理解这一点。
我能在没有任何代码的情况下得到一般响应吗?

如果使用服务定位器,通常意味着您明确要求某个对象为您创建另一个对象,这通常被视为反模式。 依赖注入是另一种方式

假设你有一个叫做战士的职业,这个职业有武器。 使用服务定位器,您可以向服务定位器询问战士构造器中的武器。

使用依赖注入,武器将被注入到战士的构造函数中,而无需您明确要求它。

此代码示例应用以下原则:

public类用户服务:IUserService
{
私有IUSER存储库;
//构造函数获取依赖项
公共用户服务(IUserRepository存储库)
{
this.repository=存储库;
}
}
此代码示例使用以下模式:

public类用户服务:IUserService
{
私有IUSER存储库;
公共用户服务()
{
this.repository=ObjectFactory.GetInstance();
}
}
这是服务定位器模式的一个实现:

public类用户服务:IUserService
{
私有IUSER存储库;
公共用户服务(容器)
{
this.repository=container.GetInstance();
}
}
甚至这也是服务定位器模式的实现:

public类用户服务:IUserService
{
私有IUSER存储库;
公共用户服务(IServiceLocator)
{
this.repository=locator.GetInstance();
}
}
不同之处在于,使用依赖项注入,您可以将消费者需要的所有依赖项注入消费者(但不注入其他依赖项)。注入它的理想方法是通过构造函数

使用服务定位器,您可以从某个共享源请求依赖项。在第一个示例中,这是静态的
ObjectFactory
类,而在第二个示例中,这是注入构造函数的
容器
实例。最后一个代码片段仍然是服务定位器模式的实现,尽管容器本身是使用依赖项注入注入的


您应该在服务定位器上使用依赖项注入有一些重要原因

Relatied的可能重复:我一直在做同样的事情,但这增加了我的困惑。谢谢,它真的解释了,现在我可以很好地获得所有这些示例。你能通过msdn示例帮助我解释同样的问题吗?如果类A依赖于服务A和服务B,我会为类A创建一个构造函数,如下所示:A(ServiceA ServiceA,ServiceB ServiceB);这是依赖项注入(更具体地说是构造函数注入)。使用服务定位器,您可以创建一个无参数构造函数,并在该构造函数中,向服务定位器请求ServiceA实例和ServiceB实例。这很好地解释了我。