2017-02-15 4 views
0

私は、コンストラクタの引数を取得するクラスを持っている:Dagger2で動的メンバーを持つオブジェクトをインスタンス化するにはどうすればよいですか?

public class Dependency{ 
    Dependency(int number1, int number2, int number3, DependencyListener listener){}  
} 

各依存クラスは、依存関係をインスタンス化するために、パス異なる引数を必要とします。 異なる値を転送して「this」をリスナーとして渡している間に、他のクラスが正しく起動できるモジュールとコンポーネントをどのように定義する必要がありますか?

また、この場合は@Injectメソッドをどのように使用する必要がありますか?

編集1

ジェフ・ボーマン @私は次のメソッドを使用して考えた:

@Module public class DependencyModule { 
    int first; 
    int second; 
    int third; 
    DependencyListener listener; 

    public DependencyModule(int first, int second, int third, DependencyListener listener) { 
    this.first = first; 
    this.second = second; 
    this.third = third; 
    this.listener = listener 
    } 

    @Provides Dependency provideDependency(int first, int second, int third, DependencyListener listener) { 
    return new Dependency(first, second, third, listener) 
    } 
} 

@Component(modules = { DependencyModule.class }) public interface  
DependencyComponent { 
    void inject(DependentClass1 target); 
    void inject(DependentClass2 target); 
    void inject(DependentClass3 target); 
} 

と私はどうしたら各DependentClass中:

public class DependentClass{ 
    @Inject Dependency; 
    public DependentClass{ 
     DaggerDependencyComponent.builder().dependencyModule(new DependencyModule(first, second, third, this)).build().inject(); 
    } 
} 

がそれです良い練習ですか?

答えて

1

概念的には、何を望むの工場は次のとおりです。ただし

/** Inject this wherever you want an instance of Dependency. */ 
public interface DependencyFactory { 
    Dependency create(
     int number1, 
     int number2, 
     int number3, 
     DependencyListener listener); 
} 

public class DependencyFactoryImpl implements DependencyFactory { 
    @Inject Provider<SomeDaggerDepIfNeeded> someDaggerDepProvider; 

    @Override public void create(
     int number1, 
     int number2, 
     int number3, 
     DependencyListener listener) { 
    return new Dependency(number1, number2, number3, listener, 
     someDaggerDepProvider.get() /* if necessary */); 
    } 
} 

、これは自動的に生成するように簡単ですので、これを行うには、多くの場合、組み込みのツールがあります。 GuiceはこのAssisted Injectionを呼び出し、実行時に反映されるようにFactoryModuleBuilder(オプションの拡張子JARを使用)を提供します。 ダガー2はありませんビルトイン同等の、主にGoogleはすでにオープンソースのJSR-330工場出荷時の発電機がダガー、Guiceの、そして春を含む任意のJSR-330実装のファクトリを生成AutoFactoryと呼ばれるリリースしましたので、 。

@AutoFactory 
public class Dependency{ 
    Dependency(
     int number1, int number2, int number3, DependencyListener listener, 
     @Provided SomeDaggerDepIfNeeded somedaggerDep){}  
} 

特に、生成されたファクトリにインターフェイスを実装することに興味がある場合は、その詳細については、AutoFactoryのマニュアルを参照してください。明示的に定義したインタフェースを使用すると、IDEで生成されたコードを扱うのが簡単になります。

(Daggerの依存関係を必要としない場合、またはこのクラスの他の実装を依存するクラスに置き換える場合は、そのままクラスをそのままにして、newへの呼び出しをa工場。)

+0

いいですが、AutoFactoryは15507のメソッドを持っています。主にGuavaのためです。 Androidで使用するライブラリのための膨大な数のメソッドです。 投稿した編集でそれを使いたかったと思いますか?それは良い習慣になるだろうか?または何か改善が必要なのでしょうか? – danidin

+0

あなたの別のコンポーネントテクニックに本質的に間違ったことはありませんが、ここでは過剰です。 AutoValueは実際に生成されたデープでGuavaを使用しません。 [こちらのコンテキストと回避策をご覧ください](https://github.com/google/auto/issues/268) –

関連する問題