也许我只是失明,但我不知道如何使用Guice(刚刚开始)来替换此方法中的new
调用:
public boolean myMethod(String anInputValue) {
Processor proc = new ProcessorImpl(anInputValue);
return proc.isEnabled();
}
对于测试,可能会有一个不同的处理器实现,所以我想避免new
调用,并在此过程中摆脱对实现的依赖。
如果我的类只记得处理器的一个实例,我可以通过构造函数注入它,但由于处理器被设计为不可变的,我每次都需要一个新的。
我如何使用Guice(2.0)实现这一目标?
答案 0 :(得分:27)
我现在使用Guice已经有一段时间了,但我记得有一种叫做“辅助注射”的东西。它允许您定义一个工厂方法,其中提供了一些参数并注入了一些参数。您可以注入处理器工厂,而不是注入处理器工厂,该工厂具有采用anInputValue
参数的工厂方法。
我指向javadoc of the FactoryProvider。我相信它应该对你有用。
答案 1 :(得分:10)
您可以通过注入“提供程序”来获得所需的效果,可以在运行时询问为您提供处理器。提供者提供了一种在请求之前推迟构造对象的方法。
提供商看起来像
public class ProcessorProvider implements Provider<Processor> {
public Processor get() {
// construct and return a Processor
}
}
由于提供者是由Guice构建和注入的,因此他们自己可以注入比特。
您的代码看起来像
@Inject
public MyClass(ProcessorProvider processorProvider) {
this.processorProvider = processorProvider;
}
public boolean myMethod(String anInputValue) {
return processorProvider.get().isEnabled(anInputValue);
}
答案 2 :(得分:2)
您的处理器在整个生命周期内是否需要访问anInputValue
?如果没有,可以将值传入您正在使用的方法调用,例如:
@Inject
public MyClass(Processor processor) {
this.processor = processor;
}
public boolean myMethod(String anInputValue) {
return processor.isEnabled(anInputValue);
}