.NET 服务器定位模式(Service Locator Pattern)——Common Service Locator
本文内容
- 场景
- 目标
- 解决方案
- 实现细节
- 思考
- 相关模式
- 更多信息
- 参考资料
Common Service Locator 代码很简单,它一般不会单独使用,而是作为一个单件模式,与像 .net Unity 这样的依赖注入框架一起使用。Common Service Locator 是 Unity 的一部分。
下载 CommonServiceLocator
下载 CommonServiceLocator Demo
场景
假设你有一个类,该类依赖几个服务 Service(这些服务也可以看做是几个类),这些服务是在编译阶段指定具体类型的。在接下来的例子中,ClassA 在编译阶段依赖 ServiceA 和 ServiceB。如下图所示。

这样做有如下缺点:
- 若替换或更新所依赖的服务(或类),显然,必须修改源代码,并且重新编译解决方案;
- 这些所依赖的具体实现(依赖的服务的具体实现)必须在编译时可用;
- 你的类很难单独测试,因为它们直接引用了那些依赖。这意味着这些依赖不能用 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)。更多信息,参看 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
- Service Locator on MSDN
关于服务定位器,更多资料,参看 The SharePoint Service Locator。
参考资料
- Microsoft Developer Network - The Service Locator Pattern
- The SharePoint Service Locator
- 控制反转和依赖注入模式 by Martin Fowler
- Service Locator
- Common Service Locator library
- Service Locator is an Anti-Pattern by Mark Seemann
.NET 服务器定位模式(Service Locator Pattern)——Common Service Locator的更多相关文章
- Service Locator Pattern 服务定位
https://www.geeksforgeeks.org/service-locator-pattern/ Service Locator Pattern Last Updated: 06-03-2 ...
- [Design Pattern] Service Locator Pattern 简单案例
Service Locator Pattern,即服务定位模式,用于定位不同的服务.考虑到 InitialContext::lookup 的成本比较高,提供了 Cache 类缓存以定位到的服务. 代码 ...
- 徒手用Java来写个Web服务器和框架吧<第三章:Service的实现和注册>
徒手用Java来写个Web服务器和框架吧<第一章:NIO篇> 徒手用Java来写个Web服务器和框架吧<第二章:Request和Response> 这一章先把Web框架的功能说 ...
- NET设计模式 第二部分 结构性模式(10):组合模式(Composite Pattern)
组合模式(Composite Pattern) ——.NET设计模式系列之十一 Terrylee,2006年3月 概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复 ...
- autofac使用Common Serivce Locator跟随wcf,mvc,web api的实例控制
autofac本身只提供了基本的ioc容器的功能 要想在mvc,wcf,web api中使用,除了autofac本身,还需要引入对应的包(点击对应连接可查看文档) 除此之外,使用Common Serv ...
- 设计模式之委派模式(Delegate Pattern)深入浅出
学习目标:精简程序逻辑,提升代码的可读性. 内容定位:希望通过对委派模式的学习,让自己写出更加优雅的代码的人群. 委派模式定义: 委派模式(Delegate Pattern)的基本作用是负责任务的调度 ...
- AGPS 常见的两种定位模式
SI 定位模式: 用户发起定位请求,辅助GPS 模块快速进行定位.时间在6秒-15秒之间. 这个方式能够有效的解决普通GPS 最快需要30秒时间获得卫星星历的搜星慢的问题,如果使用AGPS将通过中移动 ...
- 第 2 章 代理模式【Proxy Pattern】
第 2 章 代理模式[Proxy Pattern] 以下内容出自:24种设计模式介绍与6大设计原则.pdf 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代 ...
- 第 1 章 策略模式【Strategy Pattern】
第 1 章 策略模式[Strategy Pattern] 以下内容出自: 24种设计模式介绍与6大设计原则.pdf 刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手 ...
随机推荐
- Redis源代码分析(三十五)--- redis.c服务端的实现分析(2)
在Redis服务端的代码量真的是比較大,假设一个一个API的学习怎么实现,无疑是一种效率非常低的做法,所以我今天对服务端的实现代码的学习,重在他的运行流程上.而对于他的模块设计在上一篇中我已经分析过了 ...
- 教你调用数据库读取短信 记事本 通讯录文件,让ios5的短信恢复到ios4
由于高版本的ios固件向下恢复到低版固件时无法通过itunes恢复备份,所以一些数据,比如SMS需要通过提取文件的方式单独进行备份恢复特别是ios5的短信,之前很是头痛,直接将文件恢复到指定目录修改权 ...
- ArcGIS 在高清屏中主界面界面字体和图标显示过小,如何解决?
作者:安日链接:https://www.zhihu.com/question/40658050/answer/132382971来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- python测试开发django-30.发送附件EmailMessage
前言 Django的 send_mail() 和 send_mass_mail() 函式事实上是对 EmailMessage 类使用方式 的一个轻度封装.send_mail() 和相关的其他封装函式并 ...
- Linux学习6-CentOS搭建appium服务
前言 用过appium的应该清楚,每次都需要先启动appium服务,然后再运行代码非常不方便,像selenium就不用启动服务,直接运行脚本. appium实际上只是提供服务,所以我想把它搭建到阿里云 ...
- 手机也需“绿色环保”,省电类APP或将成为“标配”?
随着移动APP的大幅添加.非常多用户发现,这手机耗电量是越来越大了,在各种娱乐应用.办公应用.社交应用的冲击下,以往两天充一次电都OK.如今一天充一次还不够用,因为续航能力变弱.这也为用户带来 ...
- SpringBoot下的Job定时任务
编写Job定时执行任务十分有用,能解决很多问题,这次实习的项目里做了一下系统定时更新三方系统订单状态的功能,这里用到了Spring的定时任务使用的非常方便,下面总结一下如何使用: 一,@schedul ...
- 黑吃黑第四季/全集Banshee迅雷下载
英文全名Banshee,第5季(2015)Cinemax. 本季看点:<黑吃黑>Ana Ayora加盟第四季,将会饰演Nina Cruz,表面上是在镇里一个聪明而又强悍的新副警长,但实际是 ...
- Android 常用的数据加密方式
前言 Android 很多场合需要使用到数据加密,比如:本地登录密码加密,网络传输数据加密,等.在android 中一般的加密方式有如下: 亦或加密 AES加密 RSA非对称加密 当然还有其他的方式, ...
- [转]有关Apache alias的一点问题
转自:http://www.thinkphp.cn/topic/11973.html Apache 的Alias 指令映射URL到文件系统的特定区域 一个简单的例子: Alias /mytest /w ...