如何使用Guice的AssistedInject?

2022-08-31 10:56:48

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


答案 1

检查 FactoryModuleBuilder 类的 javadoc。

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

文档中的示例是RealPayment

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

看到这一点,并且应该由容器注入,但 startDate 和数量应由开发人员在实例创建期间指定。CreditServiceAuthService

因此,您不是注入 a,而是注入 a 的参数,这些参数标记为PaymentPaymentFactory@AssistedRealPayment

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

答案 2

推荐