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

Nam*_*ind 7 registry design-patterns dependency-injection 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];
  }
}
Run Code Online (Sandbox Code Playgroud)

Nig*_*888 22

注册表模式

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

DI容器/ DI模式

DI容器包含一个注册表,该注册表具有对象类型抽象的映射.更先进的是,当一个对象被解析时,它被实例化,所有对象的依赖性也是如此.

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

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

服务定位器

服务定位器被许多人认为是反模式的.您的想法是将容器注入对象或使用对DI容器的静态引用以在运行时创建实例.

主要区别在于应用程序明确依赖于(因此紧密耦合到)DI容器.

使用Service Locator的另一个缺点是,因为您正在注入DI容器,所以无法从类构造函数中看到它依赖的接口.您必须查阅文档或分析源代码以确定类的依赖关系.

虽然被认为是反模式,但仍有一些情况下使用它是有意义的.但是,在所有其他选项(环境背景,财产注入等)用尽之后,它应该被视为最后的手段.