Dependency injection 按接口设计vs IoC/DI

Dependency injection 按接口设计vs IoC/DI,dependency-injection,inversion-of-control,Dependency Injection,Inversion Of Control,长期以来,我一直在使用基于接口/继承的多态性设计应用程序,以获得松散耦合的代码。就我所见(到目前为止),DI框架/IoC仅仅提供了使之“更容易”的工具,然而,额外的抽象级别似乎是多余的,并且会增加额外的开销 我能想到的唯一原因是,如果一个大型团队已经知道一个特定的DI/IoC框架,那么每个人都可以站在同一个页面上 从我的角度来看,DI似乎在做与按接口设计相同的事情,我希望不止这些,有人能向我解释为什么使用DI/IoC框架是更好的策略吗 我真的希望我对DI/IoC的理解是错误的。首先,你能阅读并编

长期以来,我一直在使用基于接口/继承的多态性设计应用程序,以获得松散耦合的代码。就我所见(到目前为止),DI框架/IoC仅仅提供了使之“更容易”的工具,然而,额外的抽象级别似乎是多余的,并且会增加额外的开销

我能想到的唯一原因是,如果一个大型团队已经知道一个特定的DI/IoC框架,那么每个人都可以站在同一个页面上

从我的角度来看,DI似乎在做与按接口设计相同的事情,我希望不止这些,有人能向我解释为什么使用DI/IoC框架是更好的策略吗

我真的希望我对DI/IoC的理解是错误的。

首先,你能阅读并编辑其中任何缺失的点吗

如果你期望DI容器a)是非常复杂的野兽或b)一个全新的设计范式,我认为你的反应是以一种正常的防御方式,一种接近过度炒作的概念的方式

虽然人们可以投入大量精力以各种神秘的方式使用DI容器,而且wrt与AOP等有很多重叠,但典型的最佳点是直接自动连接依赖项,而不需要“所有团队都需要了解”任何内容或“开销”(你是指概念还是性能?如果是后者,你是否在实际应用中衡量了影响?)

但要理解这一点:-自由和专注于干净的设计,这是因为减少了摩擦和增加了延展性,这是因为你扔掉了大量的样板代码(如果情况发生变化,有必要重新调整它)IOC容器对我来说是开发生态系统的一个关键部分。虽然它们只是在这里和那里做一些新的,但它们的影响与它们所做的实际(小)工作不成比例


至于它们是否不同于普通的基于接口的编程和良好的设计原则,我将它们视为更小的东西——一个只支持其中一种功能的工具。

不,DI/IoC与按接口设计不同

DI/IoC引擎实际上只是一个大的实例工厂,它使您不必编写和维护自己的引擎

好处是维护更少(您无需编写)如果编写DI/IoC引擎的团队比你和你的团队更好,你就可以使用更高质量的软件。如果你选择的是比你自己开发的解决方案更广的发行量的软件,那么外人就有可能从广泛阅读的书籍中知道如何使用它。通过了解知名框架并获得经验,团队成员的简历将得到增强


我鼓励您继续设计接口,但DI的功能远不止这些。

谢谢,这很好,我所说的开销是概念上的,我意识到性能的影响很小,但对于我的一般应用领域来说,它可以忽略不计。-顺便说一句,我正在考虑使用Ninject(C#/.Net)在一个新项目上。@slomojo:那样的话,只要你不在[ab]上发疯就行了使用容器喜欢在没有正确分析成本/收益的情况下向您抛出的各种诡计,您可以将DI容器视为自动编写新语句链,以使您的代码更具可塑性。普通开发人员需要了解的唯一一件事是DI绑定。但即使做了这么多,您也会从中获益匪浅关于人们必须有意识地思考系统各个区域之间的耦合问题。@slomojo:allow@Mark Seemann(如果你想获得良好的DI建议,建议阅读他在这里的最高评级帖子)很快就会出版一本书(已经以电子MEAP的形式出版)我期待着我自己——这可能会对你有所帮助。它将涵盖依赖管理中涉及的所有微妙模式(以及对特定容器的处理)。希望其他人也能提供一些信息。