服务定位器、依赖注入(和容器)和控制反转

2023-11-22

我已经编程有一段时间了,但从来没有兴趣从理论上了解每个概念的含义,我可能正在使用各种编程概念,但我并不知道。

服务定位器: 对我来说,指的是通过减少代码量来加快开发速度的捷径记录。一个问题是:定位器可以仅引用名称空间/类,或者我可以拥有变量注册表吗?

以下是我对它的理解:

$locator = new ServiceLocator()
$locator->set('app', new System\Application());
$locator->set('db', new System\Pdo());

// Get the objects
$locator->get('db')->connect();
$locator->get('app')->run();

依赖注入(和依赖注入容器): 在对象中注入对象,无论工厂模式如何,都可以更快地访问这些对象。还有 DI 容器?

以下是我对它的理解:

$app = new System\Application(System\Config::load());

控制反转: 不理解这个设计模式(或者理解但不知道我做的是不是IoC)

那么,理论上(最好有简单的例子),这些概念分别意味着什么?我是对的,还是有什么问题/可以改进吗?

Thanks!


服务位置和依赖注入首先是为了解耦类,以便可以轻松地测试和更改它们。

当你比较register and resolve的一部分国际奥委会容器 with a 服务定位器 it seems是一样的。

您可以使用 IoC 容器作为服务定位器,这被​​认为是一种反模式。当您使用服务定位时,您始终必须在整个架构中主动调用服务定位器。因此,您可以解耦您的类,但另一方面,您可以将它们全部耦合到服务定位器。此外,使用服务定位器发现依赖关系更加困难,因为您隐藏了依赖关系。而使用依赖注入时,您可以使用构造函数注入将依赖关系设为“公共”。

当您使用 IoC 容器时,您使用依赖注入(构造函数注入或属性注入)。 IoC 容器现在能够通过查看构造函数参数来解析依赖关系图并创建整个依赖关系图。这就是所谓的自动连线。服务定位器无法自动装配依赖项。 正如我已经提到的,您不必被迫使用自动装配,您可以通过简单地直接调用每个类中的 IoC 容器来轻松地使用 IoC 容器,就像服务定位器一样,但你不应该!

也可以看看:https://stackoverflow.com/a/11319026/175399

enter image description here

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

服务定位器、依赖注入(和容器)和控制反转 的相关文章

随机推荐

  • JPopupMenu 上的 JComboBox

    我正在尝试使用复合 Swing 组件作为菜单的一部分 除了一个细节之外 一切都运行良好 该组件包含JComboBoxes 每当用户单击其中之一打开其下拉菜单时 下拉菜单将打开 但菜单会消失 是否可以使菜单保持打开状态JComboBox被点击
  • 使用 .NET 远程读取事件日志

    我想读取远程计算机上的事件日志以检查测试期间是否有错误 这是一些相关代码 public bool CheckEventLogs DateTime start EventLog myEventLog new EventLog CustomLo
  • 宽度以百分比设置的“position:fixed”侧边栏?

    I ve successfully used the beautiful Susy grid system to create a responsive layout similiar to the one of WebDesignerWa
  • 如何在点击android中的edittext时显示自定义键盘

    我的应用程序中有一个自定义键盘 问题是如何在单击 edittext 时播放此键盘 我使用 setonfocuschangre 侦听器 现在当 edittext 焦点更改时会出现自定义键盘 但我想在每次单击 edittext 时显示此键盘 我
  • 什么是 NullReferenceException,如何修复它?

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我有一些代码 当它执行时 它会抛出一个NullReferenceException 说 你调用的对象是空的 这是什么意思 我该如何修复此错误 原因是什么 底线
  • Rails - 测试装置错误 NoMethodError:nil 的未定义方法“类型”:NilClass

    我在运行使用具有模型之间关联的装置的测试时遇到问题 这是我一运行就收到的错误rake test ERROR test truth SevenPortfolioTest 0 005154775 test truth SevenPortfoli
  • 如何将 MongoDB 文档转换为 JSON 对象

    我正在尝试使用从查找查询返回的 MongoDB 文档作为 NodeJS 中的请求正文发出发布请求 但是在服务器上我收到错误 无效的 JSON 以下是我尝试发布的文档 id ObjectId 5739a6bf3f1b41477570dc89
  • 任意分隔符/转义字符处理的最佳算法是什么?

    令我有点惊讶的是 网上没有任何关于此问题的信息 而且我不断发现这个问题比我想象的要棘手一些 规则如下 您从分隔 转义数据开始将其拆分为数组 分隔符是一个任意字符 转义字符是任意一个字符 分隔符和转义字符都可以出现在数据中 正则表达式很好 但
  • 组织Android SDK的代码文件/XML文件

    有人可以提供一些组织我的项目以使其干净的策略吗 假设我有很多活动 将它们全部放入一个单独的包中 同时将其他类 例如自定义适配器 放入另一个包中以更好地分离 逻辑 是否很好 另外 在为布局创建 XML 文件时 如果我有一些用于某些活动的布局和
  • 修复 CSS 流体网格中的子像素舍入问题

    我正在尝试创建一个流畅的 CSS 网格 它适用于 Firefox 和 IE8 但不适用于 Safari Chrome Opera 其中子像素舍入问题变得可见 http jsfiddle net bJKQ6 2 column float le
  • 为什么 BinaryReader.ReadUInt32() 会反转位模式?

    我正在尝试使用 BinaryReader 类读取二进制文件 并且我需要将其作为 UInt32 块读取 然后进行一些位移等操作 但是 由于某种原因 当我使用 ReadUInt32 方法时 位顺序会颠倒 例如 如果我有一个文件 其中前四个字节的
  • 传递配置参数以在 R 中安装包

    我正在尝试安装一个包R来自 CRAN 存储库 我必须在配置阶段 但我不知道如何做到这一点install packages gt install packages Rmpfr checking mpfr h usability no chec
  • 在 Vue.js 中,如何查找哪些数据更改导致组件重新渲染?

    在 Vue js 中 当某些数据发生变化时 组件会重新渲染 更新 有时重新渲染频率太频繁 我想找出哪些数据的更改导致了此重新渲染 如何找出导致重新渲染的更改数据 Using 深度差异和一个简单的观察程序 您可以轻松找到虚拟机数据的先前副本之
  • 为什么“tail”不能截断日志文件?

    我正在尝试使用 cron 脚本管理日志文件大小 我基本上想每晚删除日志文件中除最后 2000 行之外的所有内容 我正在尝试运行此命令 但它似乎正在清空整个文件而不是执行我想要的操作 tail 2000 日志文件 txt gt 日志文件 tx
  • CakePHP 数据库表,缺少默认数据源

    I found this类似的问题 但我的问题不同 我将 CakePHP 2 2 应用程序移至另一台服务器 迁移前不存在任何问题 迁移后大多数事情都运行良好 我可以访问我的大部分数据库表等 但是当我尝试访问我的其中一个表时 我收到此错误 E
  • 将 Sqlite BigInt 转换为日期

    我有一个 Sqlite 数据库 用作 Quartz net 调度程序作业的 ado net 作业存储 在一个表中 名为 START TIME 的列的类型为 big int 有没有办法将 bigint 转换或转换为日期值 我希望能够查询数据库
  • JSON - 无法使用 Jackson 序列化对象内的 JSONObject

    我有以下课程 class A String abc String def appropriate getters and setters with JsonProperty Annotation 我打电话给Jacksons objectMa
  • 如何防止未启用的 EditText 出现键盘

    我的活动有一个EditText据称 在用户单击屏幕的编辑按钮之前 该内容是不可编辑的 I did edit setEnabled false 但仍然会为用户显示一个键盘 并且可以将值添加到EditText通过键盘在屏幕上显示 即使屏幕可能看
  • json -c json_object_to_json_string 释放内存时

    我正在使用 json c 库将 json object 发送到客户端 我注意到没有本机函数来释放 json object to json string 分配的内存 该库会自动释放它吗 或者我必须 free str 以避免内存泄漏 我试图阅读
  • 服务定位器、依赖注入(和容器)和控制反转

    我已经编程有一段时间了 但从来没有兴趣从理论上了解每个概念的含义 我可能正在使用各种编程概念 但我并不知道 服务定位器 对我来说 指的是通过减少代码量来加快开发速度的捷径记录 一个问题是 定位器可以仅引用名称空间 类 或者我可以拥有变量注册