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


niecprea
871 声望54 粉丝

Hello world!