定义
服务定位模式(Service Locator Pattern)指的是在组合根以外的地方,以不确定的一群不稳定依赖对象,作为依赖需求组件提供给应用程序使用。
更多解释详见服务定位模式-维基百科
public class MainCityController
{
public MainCityController()
{
}
public void StartUp()
{
IProductService service = Locator.GerService<IProductService>();
var products = service.GetFeaturedProducts();
// products do something ...
}
}
相对于IOC容器来讲,服务定位模式是一种反面模式(组合根以外使用),它所造成的危害如下
- 因为需要对
Locator
事先注册对应的服务项,否则会造成获取服务失败,也就造成了时序耦合。 - 隐藏其获取服务的依赖关系,限制了对此服务的了解。(因为使用此服务,所以它所涉及的依赖关系还是应该知道的)
- 在对应的模块中直接使用
Locator
,会把不需要的依赖项带入进来,如果Locator
归属在其他模块,那么也就把Locator
对应的模块强行绑定进来。
服务定位成为反面模式最根本的原因就是在组合根以外的地方获取依赖对象,如果在组合根中进行依赖项的获取和解析,使用IOC容器和服务定位都是没问题的。