有缺点吗?我现在感觉几乎依赖它了。每当项目超过一定规模时,几乎都会对标准模式产生过敏反应,并立即使用依赖注入框架重新连接它。

我发现的最大问题是它可能会让其他刚刚学习它的开发人员感到困惑。

另外,如果它是我使用的语言的一部分,我会感觉好得多。不过,至少对于 Java 来说,有几个非常好的轻量级库。

想法?不好的经历?或者只是不再担心它?


[编辑]回复:依赖注入本身的描述

抱歉说得含糊。 马丁·福勒 可能比我能描述得更好......无需浪费精​​力。

巧合的是,这证实了这一点,即它尚未得到广泛实践,如果每个人都不能跟上它的速度,那么在与团队合作时可能会成为障碍。

有帮助吗?

解决方案

我在博客文章中尝试描述了一些可能的缺点: http://kevin-berridge.blogspot.com/2008/06/ioc-and-di-complexity.html

其他提示

我在 DI 方面遇到的问题与我在 COM 和任何类似于以下内容的代码方面遇到的问题相同:

i = GetServiceOrInterfaceOrObject(...)

问题是这样的系统无法从代码中理解。[其他] 必须有文档定义服务/接口/对象 X 可以请求哪些服务/接口/对象。该文档不仅必须得到维护,而且还必须像源代码一样易于获取。

除非文档写得很好,否则通常仍然不容易看出对象之间的关系。有时关系是暂时的,这使得它们更难被发现。

我喜欢 KISS 原则,并且坚信使用正确的工具来完成工作。如果对于给定项目来说 DI 的好处超过了编写可理解代码的需要,那么就使用它。

另外,如果它是我使用的语言的一部分,我会感觉好多了。

仅供参考,JDK 6 中有一个非常简单且实用的依赖注入。如果您需要轻量级、简单的依赖注入,那么就使用它。

使用 服务加载器 类 您可以基于类请求服务(或服务的许多实现):

 package dependecyinjection;  
 import java.util.ServiceLoader;  

 public abstract class FooService {  

     public static FooService getService() {  
         ServiceLoader<FooService> loader = ServiceLoader.load(FooService.class);  

         for (FooService service : loader) {  
             return provider;  
         }  

         throw new Exception ("No service");  
     }  

     public abstract int fooOperation();  

 }  

 package dependecyinjection;  
 public class FooImpl extends FooService {  
     @Override  
     public int fooOperation() {  
         return 2;  
     }  
 }  

ServiceLoader如何定义返回的服务实现?

在您的项目文件夹中创建一个名为的文件夹 META-INF/服务 并创建一个名为 依赖注入.FooService. 。该文件包含一行指向服务实现。在这种情况下:依赖注入.FooImpl

这一点尚未广为人知。

我是 IO 的忠实信徒,但是我看到一些项目有巨大的 xml 配置文件,没有人理解。所以在使用 xml 编程时要小心。

在我看来,主要缺点是学习曲线(正如您所指出的)以及添加抽象可能使调试变得更加困难(这实际上也是学习曲线的一部分)。

对我来说,DI 似乎更适合更大、更复杂的系统——对于小型一次性应用程序,它可能会导致应用程序过度架构,基本上,让架构需要比它更多的开发时间来坚持可以弥补它所提供的价值。

别再担心了。我认为,随着时间的推移,IoC 技术将成为大多数开发人员的第二天性。我正在尝试向工作中的开发人员传授这方面的知识,但我发现很难传达这一信息,因为这对我们一直以来做事的方式来说感觉很不自然。这恰好是错误的方式。此外,我发现 IoC 新手和项目新手的开发人员的处境更加困难。他们习惯于使用 IDE 跟踪依赖关系,以了解整个事物如何“结合在一起”。这些信息通常被写入晦涩难懂的 XML 中。

对于我们这些在家玩的人来说,您能否添加一两个链接来解释依赖注入实际上是什么?这 维基百科文章 很有趣,但不太有启发性。

我能想到的唯一缺点是通过不断的虚拟调用而导致性能的微小下降:)

@布洛格胡子: http://www.martinfowler.com/articles/injection.html 可能是关于该主题的最好的文章之一

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top