php service locator,服务定位器模式(Service Locator)
服务定位器模式(Service Locator)
服务定位器模式被一些人认为是一种反面模式。它违反了依赖倒置原则。该模式隐藏类的依赖,而不是暴露依赖(如果暴露可通过依赖注入的方式注入依赖)。当某项服务的依赖发生变化时,使用该服务的类的功能将面临被破坏的风险,最终导致系统难以维护。
4.2.1. 目的
服务定位器模式能够降低代码的耦合度,以便获得可测试、可维护和可扩展的代码。DI 模式和服务定位器模式是 IOC 模式的一种实现。
4.2.2. 用法
使用 ServiceLocator ,你可以为给定的 interface 注册一个服务。通过使用这个 interface,你不需要知道该服务的实现细节,就可以获取并在你应用中使用该服务。你可以在引导程序中配置和注入服务定位器对象。
4.2.3. 实例
Zend Framework2 使用服务定位器创建和共享框架中使用的服务(EventManager,ModuleManager,以及由模块提供的用户自定义服务等)
4.2.4. UML Diagram
[
](https://lccdn.phphub.org/uploads/images/201803/19/1/2pn0Utic36.png)
4.2.5. Code
你也可以在 GitHub 上查看此代码
ServiceLocator.php
namespace DesignPatterns\More\ServiceLocator;
class ServiceLocator
{
/**
* @var array
*/
private $services = [];
/**
* @var array
*/
private $instantiated = [];
/**
* @var array
*/
private $shared = [];
/**
* 相比在这里提供一个类,你也可以为接口存储一个服务。
*
* @param string $class
* @param object $service
* @param bool $share
*/
public function addInstance(string $class, $service, bool $share = true)
{
$this->services[$class] = $service;
$this->instantiated[$class] = $service;
$this->shared[$class] = $share;
}
/**
* 相比在这里提供一个类,你也可以为接口存储一个服务。
*
* @param string $class
* @param array $params
* @param bool $share
*/
public function addClass(string $class, array $params, bool $share = true)
{
$this->services[$class] = $params;
$this->shared[$class] = $share;
}
public function has(string $interface): bool
{
}
/**
* @param string $class
*
* @return object
*/
public function get(string $class)
{
if (isset($this->instantiated[$class]) && $this->shared[$class]) {
return $this->instantiated[$class];
}
$args = $this->services[$class];
switch (count($args)) {
case 0:
$object = new $class();
break;
case 1:
$object = new $class($args[0]);
break;
case 2:
$object = new $class($args[0], $args[1]);
break;
case 3:
$object = new $class($args[0], $args[1], $args[2]);
break;
default:
throw new \OutOfRangeException('Too many arguments given');
}
if ($this->shared[$class]) {
$this->instantiated[$class] = $object;
}
return $object;
}
}
LogService.php
namespace DesignPatterns\\More\\ServiceLocator;
class LogService
{
}
4.2.6. 测试
Tests/ServiceLocatorTest.php
namespace DesignPatterns\\More\\ServiceLocator\\Tests;
use DesignPatterns\\More\\ServiceLocator\\LogService;
use DesignPatterns\\More\\ServiceLocator\\ServiceLocator;
use PHPUnit\\Framework\\TestCase;
class ServiceLocatorTest extends TestCase
{
/**
* @var ServiceLocator
*/
private $serviceLocator;
public function setUp()
{
$this->serviceLocator = new ServiceLocator();
}
public function testHasServices()
{
$this->serviceLocator->addInstance(LogService::class, new LogService());
$this->assertTrue($this->serviceLocator->has(LogService::class));
$this->assertFalse($this->serviceLocator->has(self::class));
}
public function testGetWillInstantiateLogServiceIfNoInstanceHasBeenCreatedYet()
{
$this->serviceLocator->addClass(LogService::class, \[\]);
$logger = $this->serviceLocator->get(LogService::class);
$this->assertInstanceOf(LogService::class, $logger);
}
}
php service locator,服务定位器模式(Service Locator)相关推荐
- 三十六、服务定位器模式 (Service Locator Pattern)
服务定位器模式(Service Locator Pattern)用于想使用 JNDI 查询定位各种服务的时候 考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术 在首次请求某 ...
- Java服务定位器模式
服务定位器模式(Service Locator Pattern)用在我们想使用 JNDI 查询定位各种服务的时候.考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术.在首次请 ...
- 避免在ASP.NET Core中使用服务定位器模式
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:服务定位器(Service Locator)作为一种反模式,一般情况下应该避免使用,在 ...
- Service Locator服务定位器
先讲服务定位器, 有些摘录于 http://www.digpage.com/convention.html Service Locator目的也在于解耦他的模式非常贴合Web这种基于服务和组件的应用的 ...
- 设计模式 - 服务定位模式 Service Locator Pattern
译者序:看 spring framework 时候了解到的 Service Locator 模式,顺便搜到了这篇文章,感觉很棒,顺手翻译下,好安利给其他小伙伴. 原文链接:http://gamepro ...
- php 服务定位,服务定位器(Service Locator)
服务定位器 服务定位器是一个了解如何提供各种应用所需的服务(或组件)的对象.在服务定位器中,每个组件都只有一个单独的实例,并通过ID 唯一地标识.用这个 ID 就能从服务定位器中得到这个组件. 在 Y ...
- 自动化运维之k8s——Kubernetes集群部署、pod、service微服务、kubernetes网络通信
目录 一.Kubernetes简介 1.Kubernetes简介 2.kubernetes设计架构 3.Kubernetes核心组件 4.kubernetes设计结构 二.Kubernetes部署 1 ...
- GoF--服务定位器模式
服务定位器模式(Service Locator Pattern)用在我们想使用 JNDI 查询定位各种服务的时候.考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术.在首次请 ...
- php service locator,Yii源码解读-服务定位器(ServiceLocator)
SL的目的也是解耦,并且非常适合基于服务和组件的应用. Service Locator充当了一个运行时的链接器的角色,可以在运行时动态地修改一个类所要选用的服务, 而不必对类作任何的修改. 一个类可以 ...
最新文章
- 【廖雪峰python入门笔记】list_创建
- oracle数据库用户密码将要过期处理办法(ORA-28002)
- php概率计算_php 抽奖概率算法
- WebView内存泄露的解决方案
- 阿里云数据库自研产品亮相国际顶级会议ICDE 推动云原生数据库成为行业标准
- Oracle中start with xx connect by prior 语句解析
- const 常量_var,let,const 的区别?
- 2013年6月13日星期四
- 百科系列——高一所遇
- em表示什么长度单位_使用相对长度单位em布局网页内容
- 黑马程序员 手写xaml界面系统维护
- aforge 相机标定_在C#和WPF中使用Aforge.NET获取网络摄像头流
- 区块链技术在银行业的应用
- OpenWrt自定义luci页面来修改配置文件
- 收藏|史上最全最实用的运营工具库,你想要的都在!
- 两个正态总体方差比的置信区间
- Bellman-Ford与spfa算法
- 小程序动画-循环放大缩小的动画(一闪一闪的)
- 海龟画图 python太阳花_《海》字意思读音、组词解释及笔画数 - 新华字典 - 911查询...
- gdpr通用数据保护条例_关于通用数据保护法规(GDPR),您需要了解的15件事
热门文章
- 计算机基础知识教程打印a4纸,一张A4纸如何打印多个准考证?_计算机办公软件基础...
- Unity3D关于如何使用iTween制作各种简易动画 (官方例子的解释)
- 2PSK,2DPSK编码
- 争夺存量用户关键战,助力企业构建完美标签体系丨01期直播回顾
- iOS UIKeyboardType(键盘类型)~图解
- MySql 5.7授权远程登陆
- 阿里巴巴资深架构师推荐:基于大中台小前台模式设计高并发电商架构
- 2016年WINLIN研发和团队计划
- C# asp.net .netcore 单层和双层PDF转为图片
- 图解大型互联网数据中心典型模型