.NET 服务器定位模式(Service Locator Pattern)

本文内容

  • 场景
  • 目标
  • 解决方案
  • 实现细节
  • 思考
  • 相关模式
  • 更多信息
  • 参考资料

下载 Demo

场景



你有一个类,该类依赖几个服务 Service(事实上,这些服务可以看做是另几个类),这些服务是在编译阶段指定具体类型的。在接下来的例子中,ClassA 在编译阶段依赖 ServiceA 和ServiceB。下图说明这个问题。

这种情况有如下缺点:

  • 若替换或更新依赖的服务(或类),显然,必须修改源代码,并且重新编译解决方案;
  • 这些依赖的具体实现(依赖的服务的具体实现)必须在编译时可用;The concrete implementation of the dependencies must be available at compile time.
  • 你的类很难单独测试,因为它们直接引用了那些依赖。这意味着这些依赖不能用 stubs 或 mock 对象替换;
  • 你的类包含创建、查找和管理这些依赖的重复代码。

下面说明如何解决这个问题。

目标



使用服务器定位模式可以完成下面的任何一个目标:

  • 你想从那些依赖解耦你的类,这样那些依赖就可以被替换或更新,而不需要或很少修改你的类;
  • 你想写逻辑代码,而逻辑代码取决于那些依赖的类,但那些依赖类的具体实现在编译阶段是不知道的;
  • 你想在不使用那些依赖的情况下单独测试你的类;
  • 你不想在你的类中写查找和管理那些依赖类的代码;
  • 你想把你的应用程序划分成松散的耦合模块,这样就可以单独开发、测试、版本控制和部署。

解决方案



创建一个包含那些服务的引用和封装了定位他们的逻辑的服务定位器。在你的类中,使用服务定位器来获得服务的实例。下图说明了类何使用服务器定位器。

服务器定位器模式不会描述如何实例化服务,它描述一个注册服务和定位服务的方法。通常情况下,服务定位器模式结合工厂模式(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)。服务定位器是控制反转的一个特例。它反转了一个应用程序的传统控制流。它是一个被调用的对象,而不是控制处理的调用者。

更多信息



参考:

  • Inversion of Control and the Dependency Injection pattern on Martin Fowler‘s Web site en cn
  • Service Locator on MSDN

关于服务定位器,更多资料,参看 The SharePoint Service Locator

参考资料


 

下载 Demo

时间: 2024-11-07 21:28:01

.NET 服务器定位模式(Service Locator Pattern)的相关文章

[Design Pattern] Service Locator Pattern 简单案例

Service Locator Pattern,即服务定位模式,用于定位不同的服务.考虑到 InitialContext::lookup 的成本比较高,提供了 Cache 类缓存以定位到的服务. 代码实现 Service 接口 public interface Service { public String getName(); public void execute(); } Service1, Service2 实现 Service 接口,提供具体服务 public class Servic

Atitit。如何实现dip, di ,ioc ,Service Locator的区别于联系

Atitit.如何实现dip, di ,ioc  ,Service Locator的区别于联系 1. Dip原则又来自于松耦合思想方向1 2. 要实现dip原则,有以下俩个模式1 3. Ioc和di的区别1 4. Service Locator模式1 5.  Service Locator vs. Dependency Injection2 6. 参考2 1. Dip原则又来自于松耦合思想方向 松耦合系统的好处有两点:一点是它适应变化的灵活性:另一点是当某个服务的内部结构和实现逐渐发生改变时,不

Service Locator 模式

什么是Service Locator 模式? 服务定位模式(Service Locator Pattern)是一种软件开发中的设计模式,通过应用强大的抽象层,可对涉及尝试获取一个服务的过程进行封装.该模式使用一个称为"Service Locator"的中心注册表来处理请求并返回处理特定任务所需的必要信息. 场景描述 某类ClassA依赖于服务ServiceA和服务ServiceB,服务的具体类型需在编译时指定. 这种条件下有以下缺点: 尝试替换或更新依赖项,必须更改类的源代码并且重新编

Design Pattern - Service Locator Pattern--转载

原文地址:http://www.tutorialspoint.com/design_pattern/service_locator_pattern.htm The service locator design pattern is used when we want to locate various services using JNDI lookup. Considering high cost of looking up JNDI for a service, Service Locato

【转】Understanding Inversion of Control, Dependency Injection and Service Locator Print

原文:https://www.dotnettricks.com/learn/dependencyinjection/understanding-inversion-of-control-dependency-injection-and-service-locator ----------------------------------------------------------------------------------------- Understanding Inversion of

PHP中应用Service Locator服务定位及单例模式

单例模式将一个对象实例化后,放在静态变量中,供程序调用. 服务定位(ServiceLocator)就是对象工场Factory,调用者对象直接调用Service Locator,与被调用对象减轻了依赖关系,这样如果被调用对象更换时,直接修改ServiceLocator的注册即可,不用修改程序中很多个地方的调用,从而减轻依赖关系. 我在学习单例模式的思路时,有一个疑问总是围绕着自己,单例模式就是静态变量呗,为什么要叫单例模式,有什么好处?静态类+静态方法不是很好? 当我学习了ServiceLocat

NET设计模式 第二部分 结构性模式(10):组合模式(Composite Pattern)

组合模式(Composite Pattern) ——.NET设计模式系列之十一 Terrylee,2006年3月 概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 意图 将对象组合成树形结构以表示“部分-整体”的层次结构.Composite模式使得用户对单个对象和组合对象的使用具有一致性.[GOF <设计模式>] 结构图 图1 Composite模式结构图

第 12 章 命令模式【Command Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> 今天讲命令模式,这个模式从名字上看就很简单,命令嘛,老大发命令,小兵执行就是了,确实是这个意思,但是更深化了,用模式来描述真是是世界的命令情况.正在看这本书的你,我猜测分为两类:已经工作的和没有工作的,先说没有工作的,那你为啥要看这本书,为了以后工作呗,只要你参见工作,你肯定会待在项目组,那今天我们就以项目组为例子来讲述命令模式. 我是我们部门的项目经理,就是一个项目的头,在中国做项目,项目经理就是什么都要懂,什么都要管,做好

dataTables的学习笔记 -- 未开启服务器数据模式

官方网站:http://www.datatables.net/ (1)未开启服务器数据模式(即"bServerSide" : false),数据会从后台直接全部获取,然后在前台全部渲染,分页是框架自己完成的. (2)开启服务器数据模式(即"bServerSide" : true),数据从后台查询,接着在前台将查询到的所有数据全部渲染到一页上,所以需要在后台分页后传到前台. bServerSide的值默认为false. 建议:在数据量非常大的情况下建议在后台分页,即开