2008-09-03 55 views
12

有没有偏差?我现在几乎感觉依赖它。每当一个项目超过一定的规模时,几乎感觉到对标准模式的过敏反应,并立即将它与一个依赖注入框架重新连接起来。依赖注入成瘾?

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

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

想法?不好的经历?或者停止担心它?


[编辑]回复:依赖注入的说明本身

对不起为是含糊。 Martin Fowler可能比我所能描述的更好......无需浪费精​​力。

巧合的是,这证实了一点,即它还没有被广泛实践,并且如果每个人都没有及时加入团队,与团队合作可能会成为障碍。

回答

1

唯一的缺点我能想到的就是通过不断的虚拟电话:)微小的性能降低

+0

也许微小应该是72点字母和大胆? – 2012-06-11 14:50:24

2

您可以添加一个或两个链接解释什么依赖注入实际上是,对于我们这些在家里一起演奏? wikipedia article是有趣的,但不是很有启发性。

+4

@Finglas,应该是这样的,但是这个答案在评论实施之前就已经完成了。 – Blorgbeard 2011-02-13 14:07:23

3

在我看来,主要的缺点是学习曲线(正如你指出),并为潜在的增加了抽象,使其更难以调试(这也是学习曲线的一部分)。

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

4

我是IO大娘,但是我看到一些没有人理解的巨大XML配置文件的项目。所以要注意用xml编程。

+0

通过XML进行依赖注入是Java程序员最大的罪恶,至少对我来说是这样。它使调试变得困难,难以理解,难以维护,并且通常会使代码变得非常难看 – nflacco 2013-01-28 20:15:50

3

就不用担心它的最好的文章之一。我认为,IoC技术对于大多数开发者来说将是第二天性。我正在努力在这里教授开发人员关于它的事情,我发现很难传达信息,因为它对我们一直做事情的方式感觉非常不自然,这恰恰是错误的方式。另外,IoC新手和我发现的新项目的开发人员都遇到了更多困难。他们习惯于使用IDE来追踪依赖关系,以了解整个事物如何“挂在一起”。这些信息通常写入奥术XML。

4

此外,如果它是我使用的语言的一部分,我觉得它会好很多 。

仅供参考如果您需要轻量级,简单的依赖注入,然后使用它,那么在JDK 6中有一个非常简单且功能强大的依赖注入。

使用基于一类ServiceLoader类,你可以请求服务(或服务的许多实现):

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 /服务文件夹,并创建一个名为dependencyinjection.FooService文件。该文件包含指向服务实现的一行。在这种情况下:依赖注入.FooImpl

这还不是广为人知。

+4

这种模式不是称为“服务定位器”而是“依赖注入”吗?请参阅http://www.martinfowler.com/articles/injection.html获取两者的描述。 – 2009-04-29 01:49:19

+0

使用这种模式会导致开发人员疯狂时,他们必须为服务隐藏的依赖关系...... – mathieu 2012-07-31 09:55:30

5

我有DI的问题是同样的问题,我有一个COM,并与看起来像任何代码:

i = GetServiceOrInterfaceOrObject(...) 

的问题是,这样的系统不能从代码可以理解。在[else]中必须有文档定义服务/接口/对象X可以请求哪些服务/接口/对象。该文档不但必须保留,而且可以像源代码那样容易地获得。

除非文档写得很好,否则通常很难看到对象之间的关系。有时候,关系是暂时的,这使得他们更难以发现。

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