Як використовувати Guice's AssistedInject?


84

Я прочитав https://github.com/google/guice/wiki/AssistedInject , але там не сказано, як передавати значення аргументів AssistedInject. Як би виглядав виклик injector.getInstance ()?


відповіді нижче не охоплюють випадків, коли той самий тип використовується кілька разів. stackoverflow.com/questions/23553865/…
Олександр О

Відповіді:


168

Перевірте 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);

8
Багато шукав і не міг знайти більш стислого та чіткого пояснення моїх сумнівів. Велике спасибі
Габбер,

18
Це легше зрозуміти, ніж документацію про Github. Молодці.
arjabbar

8
У порівнянні з цим документація Github є безглуздою.
EMM

2
Чи не слід передавати "дату" та "суму" у виклику методу "Оплата"? Чому їх слід вводити тут, у конструктор?
Харшіт

2
Для тих, хто цікавиться, RealPaymentне потрібно реалізовувати інтерфейс.
jsallaberry
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.