21

也许我只是瞎了眼,但我没有看到如何使用Guice(刚开始)来替换new此方法中的调用:

public boolean myMethod(String anInputValue) {
    Processor proc = new ProcessorImpl(anInputValue);
    return proc.isEnabled();
}

对于测试,处理器可能有不同的实现,所以我想避免new调用,并在此过程中摆脱对实现的依赖。

如果我的班级只记得处理器的一个实例,我可以通过构造函数注入它,但由于处理器被设计为不可变的,我每次都需要一个新的。

我将如何使用 Guice (2.0) 实现这一目标?

4

3 回答 3

27

我现在使用 Guice 已经有一段时间了,但我记得一个叫做“辅助注射”的东西。它允许您定义一个工厂方法,其中提供一些参数并注入一些参数。不是注入处理器,而是注入一个处理器工厂,它有一个带有anInputValue参数的工厂方法。

我将您指向FactoryProvider 的 javadoc。我相信它应该对你有用。

于 2009-06-15T14:13:05.690 回答
11

您可以通过注入“提供者”来获得所需的效果,可以在运行时要求它为您提供处理器。提供者提供了一种将对象的构造推迟到请求之前的方法。

它们在此处此处的 Guice Docs 中都有介绍。

提供者看起来像

public class ProcessorProvider implements Provider<Processor> {
    public Processor get() {
        // construct and return a Processor
    }
}

由于 Providers 是由 Guice 构建和注入的,因此它们本身可以注入比特。

你的代码看起来像

@Inject
public MyClass(ProcessorProvider processorProvider) {
    this.processorProvider = processorProvider;
}

public boolean myMethod(String anInputValue) {
    return processorProvider.get().isEnabled(anInputValue);
}
于 2009-06-15T15:43:26.550 回答
2

您的处理器是否需要anInputValue在其整个生命周期内访问?如果没有,是否可以为您正在使用的方法调用传递值,例如:

@Inject
public MyClass(Processor processor) {
    this.processor = processor;
}

public boolean myMethod(String anInputValue) {
    return processor.isEnabled(anInputValue);
}
于 2009-06-15T15:06:38.293 回答