GuiceのAssistedInjectの使い方は?


84

https://github.com/google/guice/wiki/AssistedInjectを読みましたが、AssistedInject引数の値を渡す方法が記載されていません。インジェクター.getInstance()の呼び出しはどのようになりますか?


関連して、以下の回答は、同じタイプが複数回使用される場合をカバーしていません。stackoverflow.com/questions/235538​​65/…–
Alexander Oh

回答:


168

FactoryModuleBuilderクラスのjavadocを確認してください。

AssistedInjectFactory自分でコーディングする代わりに、クラスを動的に構成できます。これは、注入する必要のある依存関係と、オブジェクトの作成時に指定する必要のあるいくつかのパラメーターを持つオブジェクトがある場合に役立つことがよくあります。

ドキュメントの例は次のとおりです。 RealPayment

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

それを参照してCreditServiceAuthServiceコンテナによって注入する必要がありますが、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
多くのことを求めましたが、私の疑問に対するより簡潔で明確な説明を見つけることができませんでした。どうもありがとう
Gabber 2014年

18
これは、Githubのドキュメントよりも理解しやすいです。よくやった。
arjabbar 2016年

8
これと比較すると、Githubのドキュメントはくだらないです。
EMM 2016

2
'date'と 'amount'を 'Payment'へのメソッド呼び出しで渡す必要はありませんか?なぜここでコンストラクターに注入する必要があるのですか?
Harshit 2018年

2
不思議に思う人のRealPaymentために、インターフェースを実装する必要はありません。
jsallaberry
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.