注册表模式与服务定位器模式与依赖项注入容器



它们之间有什么区别,而不是按键在数组中设置和获取对象?

class Registry
{
  private $container=array();
  public static function Set($name,$object){
    self::$container[$name]=$object;
  }
  public static function &Get($name){
    return self::$container[$name];
  }
}

注册表模式

注册表模式是一种用于查找仅知道其名称的对象的模式。此模式在内部存储对象的实例,并在以后使用字典映射检索这些实例

DI

容器/DI 模式

DI 容器包含一个注册表,该注册表具有对象类型抽象的映射。它更高级,因为当解析对象时,它被实例化,对象的所有依赖项也是如此。

从 DI 容器请求对象时,将获得一个对象图,该对象图以请求的对象作为根开始。通过递归遍历每个类的构造函数,从没有依赖项的类开始,并使用注册表作为指导实例化每个对象,自动注入每个依赖对象。

依赖关系注入是一种不一定使用 DI 容器的模式。DI 模式由位于应用程序入口点的组合根组成。组合根是注册类型以及实例化根对象图的位置。实例化根对象后,应用程序将自行运行。应用程序本身不引用 DI 容器,并且不与其紧密耦合。

服务定位器

服务定位器被许多人认为是反模式的。这个想法是,要么将容器注入到对象中,要么使用对 DI 容器的静态引用在运行时创建实例。

主要区别在于应用程序显式依赖于 DI 容器(因此与 DI 容器紧密耦合)。

使用服务定位器的另一个缺点是,由于要注入 DI 容器,因此无法从类构造函数中看到它所依赖的接口。相反,您必须查阅文档或分析源代码以确定类的依赖项是什么。

尽管被认为是反模式,但在某些情况下,使用起来仍然有意义。但是,在用尽所有其他选项(环境环境、属性注入等)后,应将其视为最后的手段。

最新更新