热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

您不需要依赖注入容器

DI容器在错误使用时(即在大多数情况下)不仅是代码污染者,而且是绝对的恶魔。这是静态依赖DI容器经常从各地调用。在这种情况下,

DI容器在错误使用时(即在大多数情况下)不仅是代码污染者 ,而且是绝对的恶魔。

这是静态依赖

DI容器经常从各地调用。 在这种情况下,DI容器只是一个服务定位器 ,它是一个单例。 单例具有大量方法。 除此之外,它还引入了隐藏的依赖关系 。 那可能是这样的:

class PaymentProcessor
{
public function purchase()
{
return DIPaymentModuleFactory:: me ()->purchase();
}
}

要纠正此错误,唯一的方法是仅在应用程序的最高级别上使用它,最好在应用程序启动的索引文件中使用它。 如果您以这种方式使用它-您是否真的仍然需要它? 无论如何你都不是。 已经是Catch-22了,还有两个要点。

它打破了最可靠的OOP隐喻之一

DI容器打破了David West在他的“ 对象思维”一书中谈到的乐高积木的隐喻。 我希望在一个地方实例化我的类,这个地方应该是任何请求或消息的入口。 他们的合作只能通过组成来实现。 可组合性是任何有抱负的对象思考者都追求的目标。

破坏凝聚力

而且,它打破了基本的OOP原则,即数据封装和公开行为。 为什么要实例化对象的方式对程序代码隐藏了? 为什么将它放在一些配置文件中 ? 真的,请考虑一下-废话! 这一点甚至更广泛。 为什么我们需要配置文件? 为什么某些数据的行为会被撕裂? 这正是14年前马丁·福勒(Martin Fowler)所说的,对吧? 每个人似乎都同意这一点。 但是,为什么我们继续遵循这个概念? 配置文件仅反映了过程的心态!

没有DI容器的生活

这是一个纯粹的依赖注入 。 这就是我的入口点通常的样子:

try {
echo
( new PurchaseOrder(
new LocalOrderStorage(
new NullOrderStorage()
),
new OrderId($inputParams[ 'order_id' ])
))
->newInvoice(
new InvoiceNumber(
new Vendor(
new LocalVendorStorage(),
new VendorId($inputParams[ 'vendor_id' ])
),
new VendorInvoiceNumber($inputParams[ 'vendor_invoice_number' ]),
new DateTime($inputParams[ 'date_time' ])
),
new VendorInvoiceNumber($inputParams[ 'vendor_invoice_number' ]),
new DateTime($inputParams[ 'date_time' ]),
new InvoiceAmount(
new Amount($inputParams[ 'amount' ]),
new Currency($inputParams[ 'currency' ])
)
)
->json()
;
} catch (Exxeption $exxeption) {
return
( new ErrorResult())
->json($exxeption->getCode(), $exxeption->getMessage())
;
}

太好了 加入我。

From: https://hackernoon.com/you-dont-need-a-dependency-injection-container-10a5d4a5f878



推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
author-avatar
圆季
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有