当前位置: 首页 > news >正文

Yii源码解读-服务定位器(Service Locator)

SL的目的也是解耦,并且非常适合基于服务和组件的应用。

  • Service Locator充当了一个运行时的链接器的角色,可以在运行时动态地修改一个类所要选用的服务, 而不必对类作任何的修改。

  • 一个类可以在运行时,有针对性地增减、替换所要用到的服务,从而得到一定程度的优化。

  • 实现服务提供方、服务使用方完全的解耦,便于独立测试和代码跨框架复用。

基本功能

Yii中的SL由yii\di\ServiceLocator实现

class ServiceLocator extends Component{
    // 用于缓存服务、组件等的实例
    private $_components = [];
    
    // 保存服务和组件的定义,通常为配置数组,可以用来创建具体的实例
    private $_definitions = [];
    
    // 重载了getter, 使得访问服务和组件与访问类的属性一样。
    // 保留了原来Component的getter所具有的功能
    public function __get($name){}
    
    // 增加了对是否具有某个服务和组件的判断。
    public function __isset($name){}
    
    public function has($id, $checkInstance = false){
        return $checkInstance ? isset($this->components[$id]) : isset($this->_definitions[$id]);
    }
    
    public function get($id, $throwException = true){}
    
    public function set($id, $definition){}
    
    // 删除一个服务或组件
    public function clear($id){
        unset($this->_definitions[$id], $this->_components[$id]);
    }
    
    public function getComponents($returnDefinitions = true){}
    
    // 批量注册
    public function setComponents($components)
}

数据结构

SL维护了两个数组: $_components & $_definitions。这两个数组均是以服务或组件的ID为键的数组。

SL提供了注册服务和组件的方法。

$_components用于缓存SL中的组件或服务的实例,为可读写的属性。

$_definitions用于保存这些组件或服务的定义。这个定义可以是:

  • 配置数组

  • PHP callable

  • 对象

  • 类名: is_callable($definition, true) == true

参考

  1. http://www.digpage.com/service_locator.html

相关文章:

  • JAVA-JSP之include指令
  • xml 与dto的相互转换
  • ubuntu下安装cx_oracle
  • Android ViewPager使用详解
  • lateral view
  • Spring 一二事(10) - annotation AOP
  • ServiceStack.OrmLite MVC搭建
  • JDBCTemplate
  • 20160323实盘短线操作
  • Java 开发必会的 Linux 命令
  • 第三季度斩获重要投资的15家网络安全公司
  • 被迫尝试了各个版本的asm库读取类annotation
  • 思科推出新一代互联网边界防火墙 助力企业兼顾性能与安全
  • MacBook小技巧
  • 瞧!那个SSD领域的后来者正变为引领者
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 2019年如何成为全栈工程师?
  • Angular Elements 及其运作原理
  •  D - 粉碎叛乱F - 其他起义
  • EventListener原理
  • Python进阶细节
  • React 快速上手 - 07 前端路由 react-router
  • React-redux的原理以及使用
  • Redis的resp协议
  • text-decoration与color属性
  • 入门到放弃node系列之Hello Word篇
  • 微服务入门【系列视频课程】
  • 微信小程序实战练习(仿五洲到家微信版)
  • 用Canvas画一棵二叉树
  • 优秀架构师必须掌握的架构思维
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • # 飞书APP集成平台-数字化落地
  • #、%和$符号在OGNL表达式中经常出现
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (AngularJS)Angular 控制器之间通信初探
  • (办公)springboot配置aop处理请求.
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (算法)Game
  • (原)Matlab的svmtrain和svmclassify
  • .cn根服务器被攻击之后
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net反混淆脱壳工具de4dot的使用
  • [android] 请求码和结果码的作用
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [AutoSar]BSW_Com02 PDU详解
  • [C#]C#学习笔记-CIL和动态程序集
  • [C#]获取指定文件夹下的所有文件名(递归)