2014-10-07 70 views
0

假设我有一个类,如下所示:吉斯:辅助注射和供应商

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; 

而不是正常情况下直接返回新的ComplicatedImpl

我整个的试图绑定ComplicatedImpl某种形式的Provider,但似乎我在圈子与被绕来绕去......

回答

1

我不相信这是可能的吉斯; FactoryModuleBuilder除了将显式构造函数参数与依赖关系混合以外,可以做的很少。幸运的是,写一本手册厂是相对容易:

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; 
    } 
} 

如果你愿意把addListenerComplicated界面上,你也有写:注射ComplicatedFactory,创建新实例的包装的选项,并调用addListener立即在他们身上。如果您绑定PrivateModule中的ComplicatedFactory,然后仅公开新的ComplicatedWrapperFactory,那么这会特别有效,从而使您的ComplicatedWrapperFactory成为创建新复杂实现的唯一方法。