Como usar o AssistedInject do Guice?

Respostas:

171

Verifique o javadoc da classe FactoryModuleBuilder .

AssistedInjectpermite que você configure dinamicamente Factorypara a classe em vez de codificá-la sozinho. Isso geralmente é útil quando você tem um objeto que possui dependências que devem ser injetadas e alguns parâmetros que devem ser especificados durante a criação do objeto.

O exemplo da documentação é um RealPayment

public class RealPayment implements Payment {
   @Inject
   public RealPayment(
      CreditService creditService,
      AuthService authService,
      @Assisted Date startDate,
      @Assisted Money amount) {
     ...
   }
 }

Veja isso CreditServiceeAuthService deve ser injetado pelo contêiner, mas startDate e amount devem ser especificados por um desenvolvedor durante a criação da instância.

Então, em vez de injetar um, Paymentvocê está injetando um PaymentFactorycom parâmetros marcados como @AssistedemRealPayment

public interface PaymentFactory {
    Payment create(Date startDate, Money amount);
}

E uma fábrica deve ser ligada

install(new FactoryModuleBuilder()
     .implement(Payment.class, RealPayment.class)
     .build(PaymentFactory.class));

Fábrica configurada pode ser injetada em suas aulas.

@Inject
PaymentFactory paymentFactory;

e usado em seu código

Payment payment = paymentFactory.create(today, price);
Mairbek Khadikov
fonte
8
Procurei muito e não consegui encontrar uma explicação mais concisa e clara para minhas dúvidas. Muito obrigado
Gabber
18
Isso é mais fácil de entender do que a documentação no Github. Bem feito.
arjabbar
8
A documentação do Github é uma porcaria em comparação com isso.
EMM
2
'Data' e 'valor' não deveriam ser repassados ​​na chamada do método para 'Pagamento'? Por que eles deveriam ser injetados aqui no construtor?
Harshit
2
Para quem se pergunta, RealPaymentnão precisa implementar uma interface.
jsallaberry