【问题标题】:What is the actual difference betwen a service locatior and a dependency injection?服务定位器和依赖注入之间的实际区别是什么?
【发布时间】:2012-08-22 23:56:10
【问题描述】:

我正在经历之前的讨论,其中详细讨论了服务定位器和依赖注入器之间的区别,但我仍然无法理解。 我可以在没有任何代码的情况下获得一般响应吗?

【问题讨论】:

标签: dependency-injection inversion-of-control service-locator


【解决方案1】:

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

假设你有一个名为 Warrior 的类,它有一个武器。 使用服务定位器,您可以在 Warrior 的构造函数中向服务定位器请求武器。
使用依赖注入,Weapon 将被注入到 Warrior 的构造函数中,而无需您明确要求。

【讨论】:

  • 谢谢它真的解释了,现在我可以很好地得到所有这些例子了。
  • 你能帮我解释一下这个 msdn 例子msdn.microsoft.com/en-us/library/dd458879.aspx
  • 如果 A 类依赖于 ServiceA 和 ServiceB,我将为 A 类创建一个构造函数,如下所示:A(ServiceA serviceA, ServiceB serviceB);那是依赖注入(更具体地说是构造函数注入)。使用服务定位器,您可以创建一个无参数构造函数,并在该构造函数中,向服务定位器询问 ServiceA 的实例和 ServiceB 的实例。
  • 好的,这很好地解释了我。
【解决方案2】:

此代码示例应用Dependency Injection 原则:

public class UserService : IUserService
{
    private IUserRepository repository;

    // Constructor taking dependencies
    public UserService(IUserRepository repository)
    {
        this.repository = repository;
    }
}

此代码示例使用Service Locator 模式:

public class UserService : IUserService
{
    private IUserRepository repository;

    public UserService()
    {
        this.repository = ObjectFactory.GetInstance<IUserRepository>();
    }
}

这是服务定位器模式的一个实现:

public class UserService : IUserService
{
    private IUserRepository repository;

    public UserService(Container container)
    {
        this.repository = container.GetInstance<IUserRepository>();
    }
}

甚至这是服务定位器模式的实现:

public class UserService : IUserService
{
    private IUserRepository repository;

    public UserService(IServiceLocator locator)
    {
        this.repository = locator.GetInstance<IUserRepository>();
    }
}

不同之处在于,使用依赖注入,您将消费者需要的所有依赖注入到消费者中(但仅此而已)。注入它的理想方式是通过构造函数。

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

您应该使用依赖注入而不是服务定位器的重要原因。 This article does a good job explaining it.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2023-03-08
    相关资源
    最近更新 更多