假设我有一个类,如下所示:
public class ComplicatedImpl implements Complicated {
@Inject
public ComplicatedImpl(Integer normal, @Assisted String assisted);
public void addListener(Listener listener);
}
现在,我有一个类似的ComplicatedFactory
:
public interface ComplicatedFactory {
public Complicated build(String assisted);
}
当使用FactoryModuleBuilder
时,是否可以绑定ComplicatedFactory
,以便在调用build()
时,我们执行等效的
ComplicatedImpl impl = new ComplicatedImpl(normal, assisted);
impl.addListener(listener);
return impl;
与直接返回新的CCD_ 5的正常情况相反?
我一直试图将ComplicatedImpl
与某种形式的Provider
结合,但似乎我会绕圈子。。。
我认为这在Guice是不可能的;FactoryModueBuilder除了将显式构造函数参数与依赖项混合之外,几乎无能为力。幸运的是,编写手动工厂相对容易:
public class ListeningComplicatedFactory {
@Inject Provider<Integer> normalProvider;
public Complicated createComplicated(String assisted, Listener listener) {
ComplicatedImpl impl = new ComplicatedImpl(normalProvider.get(), assisted);
// If ComplicatedImpl uses member injection, inject an Injector and call
// injector.injectMembers(impl) to call @Inject-annotated methods/fields.
impl.addListener(listener);
return impl;
}
}
如果您愿意将addListener
放在Complicated
接口上,您还可以选择编写一个包装器,该包装器注入ComplicatedFactory,创建新实例,并立即在它们上调用addListener
。如果您在PrivateModule中绑定ComplicatedFactory,然后只公开新的ComplicatedWrapperFactory,使您的ComplictedWrapperFactory成为创建新的Complexed实现的唯一方法,那么这将特别有效。