首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >注册表模式与服务定位器模式Vs依赖注入容器

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

Stack Overflow用户
提问于 2015-01-09 05:21:09
回答 1查看 5.3K关注 0票数 9

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

代码语言:javascript
运行
复制
class Registry
{
  private $container=array();
  public static function Set($name,$object){
    self::$container[$name]=$object;
  }
  public static function &Get($name){
    return self::$container[$name];
  }
}
EN

回答 1

Stack Overflow用户

发布于 2015-08-16 06:54:35

注册表模式

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

DI容器/DI模式

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

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

依赖注入是不一定使用DI容器的一种模式。DI模式由位于应用程序入口点的复合根组成。组合根是注册类型和实例化根对象图的位置。一旦根对象被实例化,应用程序就会自行运行。应用程序本身没有引用DI容器,也没有紧密耦合到它。

服务定位器

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

主要的区别是,应用程序显式地依赖于(因此紧密耦合到) DI容器。

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

虽然被认为是反模式,但仍然有一些情况下,它是有意义的使用。然而,在所有其他选项(环境上下文、属性注入等)之后,它应该被视为最后的手段。已经筋疲力尽了。

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27854298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档