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,绑定 aComplicatedFactory这样,当build()被调用时,我们做相当于

ComplicatedImpl impl = new ComplicatedImpl(normal, assisted);
impl.addListener(listener);
return impl;

与直接返回新的正常情况相反ComplicatedImpl

我一直试图绑定ComplicatedImpl到某种形式的Provider,但似乎我会绕着那个圈子转……

4

1 回答 1

1

我不相信这在 Guice 是可能的。除了将显式构造函数参数与依赖项混合之外, 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;
  }
}

如果您愿意加入addListener接口Complicated,您还可以选择编写一个包装器,该包装器注入一个 ComplicatedFactory,创建新实例并addListener立即调用它们。如果您在PrivateModule中绑定 ComplicatedFactory ,然后只公开您的新 ComplicatedWrapperFactory,这将特别有效,使您的 ComplicatedWrapperFactory 成为创建新的 Complicated 实现的唯一方法。

于 2014-10-07T23:50:42.017 回答