我正在经历之前的讨论,其中详细讨论了服务定位器和依赖注入器之间的区别,但我仍然无法理解。我可以在没有任何代码的情况下获得一般响应吗?
user1469030
问问题
184 次
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 回答