Я прочитав https://github.com/google/guice/wiki/AssistedInject , але там не сказано, як передавати значення аргументів AssistedInject. Як би виглядав виклик injector.getInstance ()?
Я прочитав https://github.com/google/guice/wiki/AssistedInject , але там не сказано, як передавати значення аргументів AssistedInject. Як би виглядав виклик injector.getInstance ()?
Відповіді:
Перевірте 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 та кількість повинні бути вказані розробником під час створення екземпляра.
Таким чином , замість інжекції 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);
RealPayment
не потрібно реалізовувати інтерфейс.