Guice:辅助注射和提供者



假设我有一个类,如下所示:

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实现的唯一方法,那么这将特别有效。

相关内容

  • 没有找到相关文章

最新更新