8

我刚刚对依赖注入的Google Guice进行了修改,并开始将其集成到我现有的应用程序中。到目前为止,一切都很好。除了它们的依赖项之外,我有许多类需要字符串、数据源等。我知道有 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?

非常感谢!

4

3 回答 3

23

它可能有助于从数据中分离依赖关系

  • 依赖项通常是服务:数据库、时钟和 RPC 存根。加上所有应用程序代码分层在这些之上:UserAuthenticatorPaymentHandlerEmailGateway.
  • 数据就是这样: a Date, aMap<String,InetAddress>甚至 a Customer。这些是简单的内存域对象。

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

于 2009-06-25T00:35:59.273 回答
2

如果您正在创建多个实例,例如单个客户,则注入它们是没有意义的。有意义的是创建一个 CustomerFactory,它可能是 @Singleton 范围,可以创建具有所有依赖项的 Customer 实例。

于 2009-07-09T07:15:28.373 回答
2

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

于 2009-07-14T13:29:18.160 回答