0

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

4

2 回答 2

2

此代码示例应用了依赖注入原则:

public class UserService : IUserService
{
    private IUserRepository repository;

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

此代码示例使用服务定位器模式:

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是注入构造函数的实例。最后一个代码片段仍然是服务定位器模式的实现,尽管容器本身是使用依赖注入来注入的。

您应该使用依赖注入而不是服务定位器的重要原因。这篇文章很好地解释了它

于 2012-08-28T15:26:14.377 回答
0

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

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

于 2012-08-28T14:33:08.210 回答