2012-01-23 1 views
70

私はhttps://github.com/google/guice/wiki/AssistedInjectと読みましたが、AssistedInject引数の値を渡す方法は記述されていません。 injector.getInstance()呼び出しはどのように見えますか?Guice's AssistedInjectの使い方は?

+0

、以下の答えは、彼と同じタイプを複数回使用されている例をカバーしていません。 https://stackoverflow.com/questions/235538​​65/using-assisted-inject-with-multiple-params-of-same-type-named-params – Alex

答えて

127

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

AssistedInjectは、Factoryを自分でコーディングする代わりに動的に設定することができます。これは、挿入する必要がある依存関係を持つオブジェクトと、オブジェクトの作成時に指定する必要があるいくつかのパラメータを持つ場合に便利です。 docummentaitonから

例RealPayment

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

CreditServiceAuthServiceがコンテナによって注入されるべきではなくたstartDateおよび量は、インスタンスの作成時に開発者が指定する必要があることを見ます。

ので、代わりのあなたはRealPayment

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

@Assistedとしてマークされ、工場出荷時は、設定済みの工場が内に注入することができる

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

をバインドされるべきパラメータでPaymentFactoryを注入しているPaymentを注入あなたのクラス。関連

@Inject 
PaymentFactory paymentFactory; 

し、あなたのコードで使用

Payment payment = paymentFactory.create(today, price); 
+6

多くの人が探し求めた、より簡潔でわかりやすい説明が見つかりませんでした。疑念。多くのお礼ありがとうございます – Gabber

+11

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

+5

Githubのドキュメントは、これと比較してうんざりです。 – EMM