Design patterns 注册表模式Vs服务定位器模式Vs依赖项注入容器

Design patterns 注册表模式Vs服务定位器模式Vs依赖项注入容器,design-patterns,dependency-injection,registry,service-locator,creation-pattern,Design Patterns,Dependency Injection,Registry,Service Locator,Creation Pattern,它们之间是否有任何区别,而不是通过键设置和获取数组中的对象 class Registry { private $container=array(); public static function Set($name,$object){ self::$container[$name]=$object; } public static function &Get($name){ return self::$container[$name]; } } 注册表模式

它们之间是否有任何区别,而不是通过键设置和获取数组中的对象

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容器,所以无法从类构造函数中看到它所依赖的接口。相反,您必须查阅文档或分析源代码以确定类的依赖关系


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

因此,注册表可以用作简单的服务定位器。@xmedeko-不完全是。注册表模式无法控制实例的生存期,但将DI容器注入应用程序会让DI容器显式控制实例的生存期。后者可以为每种类型提供不同的生存期,前者始终是单例生存期,而不管请求的类型如何。