Я читал https://github.com/google/guice/wiki/AssistedInject, но не говорит, как передать значения аргументов AssistedInject. Как выглядел бы вызов injector.getInstance()?
Как использовать Guice AssistedInject?
Ответ 1
Проверьте javadoc класса FactoryModuleBuilder.
AssistedInject
позволяет динамически настраивать Factory
для класса вместо его кодирования. Это часто полезно, когда у вас есть объект, у которого есть зависимости, которые должны быть введены, и некоторые параметры, которые должны быть указаны при создании объекта.
Пример из docummentaiton - это RealPayment
public class RealPayment implements Payment {
@Inject
public RealPayment(
CreditService creditService,
AuthService authService,
@Assisted Date startDate,
@Assisted Money amount) {
...
}
}
Смотрите, что CreditService
и AuthService
должны быть введены контейнером, но startDate и количество должно указываться разработчиком во время создания экземпляра.
Итак, вместо инъекции Payment
вы вводите PaymentFactory
с параметрами, отмеченными как @Assisted
в RealPayment
public interface PaymentFactory {
Payment create(Date startDate, Money amount);
}
И factory должен быть привязан
install(new FactoryModuleBuilder()
.implement(Payment.class, RealPayment.class)
.build(PaymentFactory.class));
Конфигурированный factory может быть введен в ваши классы.
@Inject
PaymentFactory paymentFactory;
и используется в вашем коде
Payment payment = paymentFactory.create(today, price);