依赖注入容器与注册表模式

2023-11-26

我理解依赖注入原理就是解耦代码。而不是制作new类中的实例,而不是注入它们,这使得它们 松散耦合。

现在,如果我必须传递一组将在整个应用程序中的多个类中使用的对象,我可以创建一个容器(通常称为依赖项注入容器)。

这正是我正在做的事情,因为我必须传递一个配置对象、一个记录器对象、一个翻译器对象等,这些对象将通过我的应用程序的几个类实例使用。我将整个容器传递给几个类,即使并非所有类都需要访问容器内的所有对象。这让我想到了以下问题:如果我创建一个全局注册表并将对象放入其中,然后像Registry::getInstance()->get('logger'); 那样检索它们,有什么区别? ?无论我使用全局注册表还是依赖项容器,类实例都可以访问容器或注册表中的所有对象,即使它们不需要查看/访问所有对象。

结论:如果我沿着我的类或全局注册表传递依赖项注入容器,有什么区别?


Note: sometimes people use Registries by different names. The common ones that i have seen as: Locator, Context and System.

使用全局注册表会导致您的代码与所述注册表的类名绑定。这意味着您无法独立测试您的代码。注册表的设置方式对您来说是谎言:您永远无法知道需要哪个实例。

人们很容易将 DI 容器与注册表混淆。

DI 容器不是注入到类中的东西。相反,它是工厂的增强:它决定了该类Foo需要实例Bar被注入到构造函数中。然后,根据设置,它要么获取新的实例Bar或者使用现有的依赖项来提供所述依赖项。

  • 在一个简单的工厂中,您通常必须对将被注入的依赖项进行硬编码。在这种情况下,工厂可以构建的内容受到类构造函数的“占用空间”的限制。

  • 当工厂用作 DI 容器时,它可以生成具有各种依赖项的实例。在此设置中,您的工厂专注于构造与某些特定命名空间(或其他高级)逻辑类组相关的实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

依赖注入容器与注册表模式 的相关文章

  • 电子商务是否从头开始

    我需要开发一个包含电子商务部分的新网站 我来这里是想从你那里得到一些关于我应该走哪条路的提示 该网站将有一个静态部分 其中包括一些静态页面和用于销售产品的电子商务部分 我是 Django 和 PHP 开发人员 但这是我第一次需要开发电子商务
  • 是检测异常并抛出它们还是让运行时抛出它们更好?

    假设有这样的设置 public class MyClass public void DoSomething string Data if String IsNullOrWhiteSpace Data throw new NullRefere
  • PHP 下载脚本输出损坏的文件

    我正在用 PHP 为我的 CMS 构建一个文件下载类 当时我注意到它以不同的编码格式输出文件 我尝试使用 readfile file get contents fread 但似乎都在做同样的事情 这就像与输出缓冲有关的东西 我使用脚本下载的
  • YUI压缩机或类似的PHP?

    我一直在我的测试服务器上使用 yuicompressor jar 来动态最小化已更改的 JavaScript 文件 现在我已经将网站部署到公共服务器上 我注意到服务器的策略禁止使用 exec 或其等效项 因此我不再执行 java 有没有一个
  • 在 CodeIgniter 中添加新页面

    对于我对 CodeIgniter 和 MVC 系统的无知 我提前表示歉意 我正在帮助一位家庭成员处理他们的商业网站 到目前为止 我已经能够仅通过逻辑来完成大部分所需的更改 但现在我已经走进了死胡同 我不打算继续支持他们 因为我显然不是 Co
  • 转义用户数据,无需魔法引号

    我正在研究如何在来自外部世界的数据被用于应用程序控制 存储 逻辑等之前正确地对其进行转义 显然 随着 magic quote 指令在 php 5 3 0 中很快被弃用 并在 php6 中被删除 对于任何想要升级并进入新语言功能 同时维护遗留
  • 如何使用 php DOM 获取 内的值?

    我如何使用 php DOM 获取 内的值 这是我的 xml 中的一些代码
  • PHP 电子邮件验证[重复]

    这个问题在这里已经有答案了 For PHP最好的电子邮件验证方法是什么preg NOT ereg因为它是已弃用 删除 I don t需要检查该网站是否存在 这不像最高安全性 我找到了很多方法ereg但它们 显然 不是好的做法 我建议你使用F
  • 计算 PHP 字符串中特定字符的所有出现次数的最有效方法是什么?

    计算 PHP 字符串中特定字符的所有出现次数的最有效方法是什么 用这个 echo substr count abca a will echo 2
  • 在 mysqli 准备好的语句程序风格中获取最后插入的 id 的正确方法是什么?

    我正在使用 mysqli 准备好的语句在表中插入记录 如下所示 link mysqli connect localhost my user my password world check connection if link printf
  • localhost/live - 通过 HTTP_HOST 检测

    假设我在本地开发并在实时服务器上调试小东西 在我的代码中添加这样的内容是个好主意吗 is local strpos SERVER HTTP HOST localhost false define DEBUG is local 然后在设置内容
  • Zend RegEx Validator 的自定义有意义的错误消息

    我正在验证表单中的文本字段 如下所示 name new Zend Form Element Text name name gt setLabel First Name gt setRequired true gt addFilter new
  • 错误 #520009 - 帐户受到限制

    我收到 520009 错误 帐户 电子邮件受保护 cdn cgi l email protection被限制 当尝试进行并行付款时 我的代码使用沙箱运行良好 但我切换到实时端点 它开始失败 有问题的帐户是有效的 PayPal 帐户 我使用的
  • 为什么 asort 适用于多维数组?

    抱歉 如果这是一个非常基本的问题 我无意中发现asort http php net manual en function asort php似乎适用于多维数组 示例 PHP animals array 1 gt array name gt
  • 将 echo 和 print 合并到一个语句中

    echo 1 print 2 3 返回 214 脚本如何以 14 结尾 当你这样做时 echo 1 print 2 3 PHP 会做 demo http codepad viper 7 com OfrNrs line op fetch ex
  • 控制数据是否存在于数组中

    我在mysql中有两个不同的表 我正在使用curl从json文件中获取数据 我的第一个表名称是 tblclients 该表存储客户端数据 我的第二个表名称是 tblcustomfieldsvalues 该表使用 tblclients 表的
  • PHP 中根据相似值对数组进行分组

    我有一个具有以下结构的数组
  • PHP date() 和 strtotime() 返回错误的月份 31 日

    我在用着date and strtotime 函数在下拉列表中显示接下来的 3 个月 PHP代码 echo date m Y strtotime 0 months echo date m Y strtotime 1 months echo
  • 使用 Webmin 设置 cron 作业

    我正在尝试使用 Webmin 设置一个 Cron 作业每 5 分钟运行一次 它需要定位 php 文件并运行该文件中的 php 脚本 当我在 命令 字段中输入文件路径时 它不起作用 我只是想知道我做错了什么 以及我需要 Cron 作业运行的文
  • 动态更改 FOSUserBundle 的服务参数值

    我问的是对 FOSUserBundle 使用多个实体管理器 https stackoverflow com questions 14475180 multiple entity manager for fosuserbundle之前 事实证

随机推荐