Как использовать Guice's AssistedInject?

85

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

Ноэль Яп
источник
В связи с этим ответы ниже не охватывают случаи, когда один и тот же тип используется несколько раз. stackoverflow.com/questions/23553865/…
Александр О,

Ответы:

171

Проверьте 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);
Маирбек Хадиков
источник
8
Много искал и не мог найти более лаконичного и ясного объяснения своим сомнениям. Большое спасибо
Габбер
18
Это легче понять, чем документацию на Github. Отлично сработано.
arjabbar
8
Документация Github - полная чушь по сравнению с этим.
EMM
2
Не следует ли передавать «дату» и «сумму» при вызове метода в «Платеж»? Почему они должны быть введены здесь, в конструкторе?
Harshit 05
2
Тем, кому интересно, RealPaymentне нужно реализовывать интерфейс.
jsallaberry