我们都知道为什么依赖注入是真棒 ,因为它增加了代码的结合,更容易测试,并好得多阅读! 然后是一些决定使用依赖注入容器状疙瘩了PHP与协助依赖倒置原则SOLID 。
所以,当创建你的DIC使用疙瘩,使其通过控制器,并具有在关闭创建的所有新的对象实际上只是实例化时,开发者调用$container['object']
这是伟大的!
但是,当你在你的应用程序非常大的组类 ,会发生什么? 说1000+,并且希望这些容器可用?
发展的角度来看,这将是一场噩梦将这些都在一个文件中。 什么是分离的最佳方法,或者将另外一个建议是可取?
在分离方面,怎么样:
- 创建容器
- 包括根据不同的应用组合在一起的类几个文件
- 添加增量直至文件的端部包括所述容器
在另一面,我知道Symfony2中使用XML / YAML的DIC配置,但真当应用程序包含了很多课,这并不进入多谈的事情建筑方。
有什么可以开发做时,他们有这么大的代码库?
比方说,所有的类都打算通过DI容器调用。
首先一点比较案例:如果你去一家商店买了一条裤子,那么你正在使用DI在几个瞬间。 例如,你不必告诉你需要什么尺寸,可以帮助你的人有专业知识,找出。 你将不得不说些什么样的类型你想拥有裤子的,店里的人会根据您的意愿为您介绍一些裤子(或者让你知道,那是不可能的)。 这是一个例子不是DI的答案是,所有这些裤子都来自问题。 对于进店顾客是回答这个问题完全无关。 它永远不会进入店铺后,这里需要一对某种类型的裤子的就是这个道理。 你可以要求某种类型的未指定的问题,你会得到确切的答案。 这就是DI的核心。 它是如何做的是您的业务也不是你关心的问题。 但你不能要求任何东西。 你不能在一个布店比如买面包。 这些问题必须与特定的DI主题(接口)。
疙瘩是一个关联数组。 这不是一个DI - 容器。 据你所知,将DI - 容器返回一个界面,在这里的DI - 集装箱知道要加载的实现。 让我给你一个例子,说明你在哪里疙瘩是不是DI - 容器。 你在商店,你选择了一条裤子,你想买它。 现在,你要付出。 怎么样? 这就是DI一次。 对您来说是没有问题的,你有交易几种方法可用,你会选择一个。 如何系统会回答是不适合你有意思:你会说什么,只是让你的钱包,并开始支付。
在疙瘩,你将不得不选择对象用于支付。 客户将不得不说“我需要支付对象”。 在一个真正的DI - 容器将你只要把钱交给一个合法的方式(接口的行为),并根据输入数据将DI - 集装箱知道选择(现金,信用卡,主卡),它的实现。 您不必担心。 如果你仍然要担心的是,为什么把它叫做依赖注入 ? 疙瘩是他最好的服务定位器,但使用DI,你将不得不使用的接口。 否则,有没有什么好隐瞒的,并不依赖注入。 :-)
所以,不要用粉刺的DI。 这不是一个DI - 容器。 如果你要使用疙瘩(它可以组织你的类以及信息),就不能称之为DI。 这是在其最好的服务定位器,但它不使用隐藏接口的实现。 因此,它不可能是DI。
试着组织你的代码。 有哪些不同类的功能是什么? 哪些类需要DI? 我建议你只使用DI为执行功能需求类。 当你回到店里的情况:所有功能,其中,商店的工作人员与客户直接沟通。 不为如何走路到后端试图找到另一对裤子的实施。 不为过程如何打开或关闭的商店。 但是,是如何迎接客户,并要求有人想要什么类型的裤子。 在您的应用程序:是有其接口直接使用与应用程序的交互游客,你可以创建一些类型的合同如何描述互动/类? 这是DI的设计 - 容器。 我不会用DI所有的地方。 DI配有性能损失和维修问题。 越DI你使用,你将有更多的层,越少,你就会知道发生了什么地方。 使用DI preferrably它是最有益的,这是它是最有可能的实施将改变目前的来电者将不知道该接口已经改变,也不是有意这样的改变来电。 如果你把它看作一个指导原则,那么你能做出区分类通过DI隐藏其中 - 集装箱和类没有。
那么,有想回答这个问题时要考虑几件事情。 但主之一(我认为应该回答你的问题):
你真的使用所有1000级为依赖关系?
很多时候,我们有大量的应用,但作为依赖它的典型的部分实际上通常是相当小了很多。 其原因是大量的类往往是域对象。 代表应用程序的数据或商业案例的对象。 这些类是几乎从来没有依赖关系 ,但使用的是工厂,映射器和等生成。
此外,像视图和其他特定功能的类和代码可能不会由DIC管理。
所以,你将有一个代码,并不需要由容器管理的很大一部分。
我想现在这个答案我自己。
依赖注入容器不包含在应用程序中的每一个对象。 他们被标记容器的事实是主要的问题就在这里。 “DIC的”之类的Symfony的疙瘩 不是依赖注入 。 它们是用来保存对象和主要倡导的荣耀关联数组服务定位器反模式。
见$this->get('something')
在你的代码中的Symfony,什么样的? 这是一个服务定位器。 使用和你是隐藏类的依赖,使你的对象API的骗子。 这包括你的控制器!
对象的要求应为仅将对象物的构造或方法签名可读,和提供给从这个对象依赖注入提供反转控制通过您的代码库帮助可测试性,可维护性和灵活性大大简化多态性通过它被提供。
依赖注入容器应改名为喷射器 ,因为这是他们应该做的事情-注入依赖你。 当你需要你不应该拉的对象了出来。 你将如何使用DI和控制的反转,如果你刚拉出来的时候,你需要他们使用的服务定位器?
在现实生活中,你将不会被运送整个五金商店(希望)到施工现场,所以你可以访问你需要的任何部件盖房子。 取而代之的是,工头( __construct()
请求,将需要的特定部位( Door
和Window
),去了解他们采购。 你的对象以相同的方式应有的功能; 他们应该问只为做好本职工作所需的特定的依赖。 给House
获得整个五金店充其量是可怜的OOP风格,在最坏的情况可维护性噩梦。 rdlowrey - auryn
你可以使用反射来读取对象的需求,那么实例化,并自动注入依赖。 Auryn是这个梦幻般的注射器。 你在你的引导和控制解析器设置它,然后你可以编写基于整个代码库对象typehints conrete自动注射可靠的代码。 任何抽象的类/接口? 没问题,你alias
混凝土这些直接在代码或从配置文件(推荐)阅读他们,在一个循环中走样他们的方式。 使用配置文件意味着您可以在您的处置基于配置-多态性 -只需通过创建新的对象,并改变在配置文件中一个字符串是太棒了转出一个具体的实现与其他的能力。
总之,依赖注入容器永远不会成为“太大”,除非你就错了,并用它们作为服务定位器或物体的荣耀关联数组! 你不推在那里所有的对象,以将它们拉出来当你需要他们。 如果他们懒惰加载我不在乎。 使用的实际注入。 甚至不提Laravel或“门面”。
文章来源: When can Dependency Injection Containers become too big, and what can I do about it?