Я прочитал https://github.com/google/guice/wiki/AssistedInject , но он не говорит, как передать значения аргументов AssistedInject. Как будет выглядеть вызов injector.getInstance ()?
Я прочитал https://github.com/google/guice/wiki/AssistedInject , но он не говорит, как передать значения аргументов AssistedInject. Как будет выглядеть вызов injector.getInstance ()?
Ответы:
Проверьте javadoc класса FactoryModuleBuilder .
AssistedInject
позволяет динамически настраивать Factory
класс вместо того, чтобы кодировать его самостоятельно. Это часто бывает полезно, когда у вас есть объект, у которого есть зависимости, которые должны быть введены, и некоторые параметры, которые необходимо указать во время создания объекта.
Пример из документации - это 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);
RealPayment
не нужно реализовывать интерфейс.