你有一个类,该类依赖几个服务 Service(事实上,这些服务可以看做是另几个类),这些服务是在编译阶段指定具体类型的。在接下来的例子中,ClassA 在编译阶段依赖 ServiceA 和ServiceB。下图说明这个问题。
这种情况有如下缺点:
下面说明如何解决这个问题。
使用服务器定位模式可以完成下面的任何一个目标:
创建一个包含那些服务的引用和封装了定位他们的逻辑的服务定位器。在你的类中,使用服务定位器来获得服务的实例。下图说明了类何使用服务器定位器。
服务器定位器模式不会描述如何实例化服务,它描述一个注册服务和定位服务的方法。通常情况下,服务定位器模式结合工厂模式(Factory pattern)和/或依赖注入模式(Dependency Injection pattern)。这种组合使得服务定位器创建服务的实例。
注意:
服务定位器可以定位一个服务,而无需知道它的具体类型。例如,它可能使用一个字符串密钥(string key)或服务接口类型(service interface type)。这样,你就可以替换依赖的具体实现,而无需修改类。
SharePoint Guidance Library 提供了一个服务定位器的实现。SharePointServiceLocator 类提供了访问单件 IServiceLocator 实例并管理该实例,该类一个接口的默认实现——ActivatingServiceLocator,这个类可以创建和定位服务。
The Partner Portal application 展示了如何使用服务定位器注册和定位服务,如信息库(repositories),记录服务(logging services)和配置管理服务(configuration management services)。欲了解更多信息,请参阅SharePoint服务定位器。
The Partner Portal application shows how to use the Service Locator to register and locate services such as repositories, logging services, and configuration management services. 更多信息,参看 The SharePoint Service Locator。
在使用服务定位器模式前,考虑下面几点:
There are more solution elements to manage.
You must write additional code that adds service references to the service locator before your objects can use it.
Your classes have a dependency on the service locator.
The source code is more complex and difficult to understand.
You can use configuration data to define run-time relationships.
You must provide implementations of the services. Because the Service Locator pattern decouples service consumers from service providers, it might be necessary to provide additional logic. This logic ensures that the service providers are installed and registered before service consumers try to locate them.
下面模式与服务定位器模式有关:
注入依赖(Dependency Injection)。这个模式跟服务定位器模式解决的同一个问题,只是使用了不同的方法。
控制反转(Inversion of Control)。服务定位器是控制反转的一个特例。它反转了一个应用程序的传统控制流。它是一个被调用的对象,而不是控制处理的调用者。
参考:
关于服务定位器,更多资料,参看 The SharePoint Service Locator。
下载 Demo