我只是用Google Guice修改了依赖注入,并开始将它集成到我现有的应用程序中。到现在为止还挺好。我有许多类,除了它们的依赖项,还需要Strings,DataSources等等。我知道有NamedBindings,但我真的不想为每个简单的字符串创建一个注释,我必须传递给每个类的构造函数。然后,有一个名为AssistedInject的东西,为我创建Factory实现。哇,但我还是要定义工厂的界面。这对于具有依赖关系的类是否可以,但是这个示例类呢:
public class FooBarClass {
public FooBarClass(String name, String anotherOne) {
// Some stuff
}
}
有些情况下,我怀疑如何使用Guice,或者更一般地说,DI是正确的方式。 “我经常听到:XYZ框架是新的新。”但这暗示我必须使用DI框架创建每个实例。
如果我只需要这个类的一个实例怎么办?除了两个字符串之外,这个类绝对没有依赖性。想想一个Shutdown Hook,它只会被实例化一次并作为我的Shutdown Hook传递给JVM。我应该用Guice创建这个实例吗?这看起来非常愚蠢,因为没有什么可注入,但我必须编写一个工厂接口来传递Guide两个参数,并且必须为我的FooBarClass创建一个接口来使用DI。
同样的事情适用于我需要此类的多个实例的情况。没有依赖关系,但我必须创建一堆样板代码才能从中获取任何东西。这对我来说似乎不对。
那么,我应该如何使用DI和/或Guice?
非常感谢!
答案 0 :(得分:23)
从数据中拆分依赖关系可能会有所帮助。
UserAuthenticator
,PaymentHandler
和EmailGateway
。Date
,Map<String,InetAddress>
甚至是Customer
。这些是简单的内存域对象。 DI自然最适合事物的依赖性。您应该继续使用new
作为数据模型类。
答案 1 :(得分:2)
如果您要创建多个实例,例如单个客户,则注入它们没有意义。有意义的是创建一个CustomerFactory,它可能是@Singleton范围,可以创建具有所有依赖关系的Customer实例。
答案 2 :(得分:2)
如果要在测试特定类时忽略(隔离)其复杂性,请注入依赖项。如果类只是一个数据持有者,它的代码是微不足道的(get,set,equals)。在测试目标类时,您不需要模拟它,因此注入数据实例是过度的(通常很难)。如果代码不是很简单,那么该类不仅仅是一个数据持有者,你应该在单元测试中注入和模拟它。