题 如何使用Guice的AssistedInject?


我读了 https://github.com/google/guice/wiki/AssistedInject,但它没有说明如何传递AssistedInject参数的值。 injector.getInstance()调用会是什么样的?


75
2018-01-23 17:53


起源


相关的,下面的答案不包括多次使用相同类型的情况。 stackoverflow.com/questions/235538​​65/... - Alex


答案:


检查javadoc FactoryModuleBuilder 类。

AssistedInject 允许您动态配置 Factory 为了课而不是自己编码。当您拥有一个具有应该注入的依赖项的对象以及在创建对象期间必须指定的某些参数时,这通常很有用。

文档中的示例是a RealPayment

public class RealPayment implements Payment {
   @Inject
   public RealPayment(
      CreditService creditService,
      AuthService authService,
      @Assisted Date startDate,
      @Assisted Money amount) {
     ...
   }
 }

看到了 CreditService 和 AuthService 应该由容器注入,但startDate和amount应该由开发人员在实例创建期间指定。

所以而不是注射 Payment 你正在注射一个 PaymentFactory 参数标记为 @Assisted 在 RealPayment

public interface PaymentFactory {
    Payment create(Date startDate, Money amount);
}

一个工厂应该绑定

install(new FactoryModuleBuilder()
     .implement(Payment.class, RealPayment.class)
     .build(PaymentFactory.class));

配置的工厂可以在您的课程中注入。

@Inject
PaymentFactory paymentFactory;

并在您的代码中使用

Payment payment = paymentFactory.create(today, price);

134
2018-01-23 21:51



经过多次努力,我无法找到更简洁明确的解释。非常感谢 - Gabber
这比Github上的文档更容易理解。做得好。 - arjabbar
与此相比,Github文档是废话。 - EMM
@EMM非常同意 - Hu Cao
不应该在方法调用“付款”中传递“日期”和“金额”吗?为什么要在构造函数中注入它们? - Harshit