此代码示例应用了依赖注入 http://en.wikipedia.org/wiki/Dependency_injection原则:
public class UserService : IUserService
{
private IUserRepository repository;
// Constructor taking dependencies
public UserService(IUserRepository repository)
{
this.repository = repository;
}
}
此代码示例使用服务定位器 http://en.wikipedia.org/wiki/Service_locator_pattern图案:
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
注入到构造函数中的实例。尽管容器本身是使用依赖注入来注入的,但最后一个代码片段仍然是服务定位器模式的实现。
您应该使用依赖注入而不是服务定位器有几个重要原因。这篇文章很好地解释了这一点 http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx.