![]() |
1
7
DI主要是将类之间的依赖关系解耦。 使用DI,类不再具有对实现类的引用。工厂模式接近于DI,但它的不同之处在于工厂类本身具有不需要的依赖性(例如,这将损害单元测试)。 DI也不一定是全局或应用程序范围的事务;它可以为同一应用程序和同一类配置不同的依赖关系模式。甚至可能存在运行时依赖项。DI甚至可以确定对象需要生存的生命周期或范围(请求范围、会话范围等)。 如果您查看轻量级DI实现(如 Googleâs Guice . 他们称之为新的,并不是没有意义的。 |
![]() |
2
5
维基百科有一个很好的关于好处和实现的报道。 http://en.wikipedia.org/wiki/Inversion_of_control 我发现像Spring这样的IOC容器很有用,因为它们所做的所有其他“事情”,比如事务管理,以及它们提供的代码,比如代码模板、测试基类等等,这些都非常有用。此外,在Java世界中,我认为IOC是对JavaEE标准的反应,许多开发者发现它太笨拙了。IOC,正如它已经通过Spring实现的,让您设计POJO服务组件,在大多数情况下,我猜它比JavaEE让人们跳过的环更容易。
在某种程度上,我很多,或者至少有些,是精神自慰,这意味着容器提供的IOC优势在大多数使用它们的项目中没有被充分利用。
|
![]() |
3
3
我真的很喜欢@hvgotcodes的答案,但是我想我加了几点,因为我是DI/IOC的忠实粉丝。 我们使用DI有以下优点:
当您结合了许多不同的原则(如存储库、POCO、DDD、接口、N层)时,DI/IOC的好处就可以真正看到。 我不会将它用于不太可能发展的小型应用程序。 那是我的两分钱。 |
![]() |
4
2
如果您从DI路由开始,您很快就会有一个收缩器,它为对象需要的各种依赖项取20个参数。获取这20个参数需要获取20个其他参数来构造它们。然后,在结尾(开始?)最重要的是,您将认识到您只是将自己耦合到经过仔细考虑的接口的具体实现(通过调用构造函数)。然后,6个月后,您将添加一个新的依赖项,这要求您回溯所有现有的调用并更改它们。 DI框架基本上为您处理管道。通过站在您和构造器之间,它可以询问配置(可能是XML,也可能是代码),当需要一个具体的对象时,配置会告诉它应该做什么。 对于任何具有某种自省的语言(注册一个具体的类型以满足接口,当您需要接口的实例时,然后实例化该类型),基础知识都非常简单。浏览由构造函数创建的图,然后重复。)它变得复杂的地方是 也 想要控制对象生命周期(这个记录器类应该只实例化一次,然后重用。这个dataAccessFacade应该每个线程实例化一次,等等),或者动态地选择如何满足依赖关系。DI框架通常提供对象创建工具(找出构造函数所需的依赖项)和服务定位器工具,以便并非所有内容都必须在构造函数中传递或作为方法的参数传递。它允许您用任意复杂的构造函数注册类型,获取类型的实例,而不必担心何时或如何共享实例,何时构造实例,何时销毁实例,或如何与实际类型耦合。 使用DI设计库还允许用户在需要时交换依赖项,这在与接口或继承结合时提供了很大的灵活性,而不必为每个依赖项使用构造函数或方法参数来混淆代码。 |
![]() |
SkarabePL · Yii2依赖注入、配置和继承 6 年前 |