2009-06-24 19 views
7

我只是用Google Guice进行依赖注入,并开始将它集成到我现有的应用程序中。到现在为止还挺好。除了它们的依赖关系之外,我还有很多类需要Strings,DataSources等等。我知道有NamedBindings,但我真的不想为每个简单的字符串创建一个注释,我必须传递给每个类的构造函数。然后,有一个名为AssistedInject的事情,为我创建Factory实现。哇,但我仍然必须定义工厂的界面。那好了这个例子类,它确实有依赖的类,但什么:Guice的依赖注入:没有被任何教程覆盖的东西

public class FooBarClass { 
    public FooBarClass(String name, String anotherOne) { 
     // Some stuff 
    } 
} 

有我的疑问如何使用吉斯,或者更一般地说,DI正道案件。 “我经常听到:XYZ Framework是新的新的。”但这暗示我必须创建每个实例与DI框架。

只有一个实例需要

如果我需要这个类的一个实例?这个类在两个字符串旁边绝对没有依赖关系。考虑一下Shutdown Hook,它会被立即执行一次,然后作为Shutdown Hook传递给JVM。我应该用Guice创建这个实例吗?这对我来说看起来很愚蠢,因为没有什么可以注入,但是我必须编写一个工厂接口来传递Guide两个参数,并且必须为我的FooBarClass创建一个接口来使用DI。

多个实例都需要

同样的道理也适用于在那里我需要这个类的多个实例的情况下。没有依赖关系,但我必须创建一堆样板代码才能从中得到任何东西。这对我来说似乎是错误的。

那么,我该如何使用DI和/或Guice?

非常感谢!

回答

23

它可能有助于拆分依赖关系数据

  • 依赖关系通常是服务:数据库,时钟和RPC存根。再加上所有的应用程序代码:UserAuthenticator,PaymentHandlerEmailGateway。数据就是:DateMap<String,InetAddress>或甚至Customer。这些是简单的内存域对象。

DI自然地最适合于事物的依赖性方面。您应该继续为您的数据模型类使用new

2

如果您要创建多个实例(如单个客户),注入它们没有意义。有意义的是创建一个CustomerFactory,它可以是@Singleton范围,它可以创建具有所有依赖关系的Customer实例。

2

如果您想在测试特定类时忽略(隔离)其复杂性,则注入依赖项。如果这个类只是一个数据持有者,那么它的代码很简单(get,set,equals)。在测试目标类时不需要嘲笑它,因此注入数据实例过度(通常很困难)。如果代码不是微不足道的,那么这个类不仅仅是一个数据持有者,你应该在单元测试中注入并模拟它。