0

Dagger を使用して Dependency Injection を学習しようとしています。

あなたのクラスでは、クライアント コードが依存するオブジェクトを直接インスタンス化するのではなく、@Inject で宣言し、モジュールを介して ObjectGraphs を作成し、ObjectGraph からオブジェクトを取得することを理解しています。

  @Inject CoffeeMaker coffeeMaker;

  public static void main(String[] args) {
    ObjectGraph objectGraph = ObjectGraph.create(new DripCoffeeModule());
    CoffeeApp coffeeApp = objectGraph.get(CoffeeApp.class);
    ....
  }

ただし、そのコードはすべて、ObjectGraph の作成に使用しているモジュール (この例では DripCoffeeModule) に依存しています。

これを Android アプリで使用したいと考えています。デバッグ ビルドではクラスの特定の実装が必要ですが、リリース ビルドでは実装が異なります。

どうすればいいですか?モジュールが必要な特定の実装を提供するように build.xml ant スクリプトを設定するにはどうすればよいですか? (または正しいモジュールを選択する)...

ありがとうございました。

4

1 に答える 1

3

ビルド システム時に実行することもできますが、ビルド ルールでモジュールを選択的に作成することになり、コンパイル時の制約の一部を誤って無効にしてしまう可能性があります。

ダガーだけを使用して(ビルドシステムをいじることなく)、3つの方法で条件付き配線を行うことができます。

  1. 特定の実装を提供するより具体的なすべてのモジュールを含む構成のセットごとに最上位モジュールを作成します。1 つはテスト用、もう 1 つはこの課金構造用、もう 1 つはそのためです。すべてのランタイム最上位モジュールを本番 Dex ファイルに含め、グラフの構成時にそれらの中から選択します。

  2. 指定されたコンポーネントの @Provides メソッドを作成します。このメソッドは、依存関係ですべての潜在的な実装を取得し、条件に基づいてプロビジョニング時にそれらを切り替えます。

    1. #2 と同様ですが、@Provides メソッドは Lazy に依存しているため、依存コンポーネントの作成はプロビジョニング時に実際に選択されたコンポーネントに対してのみ行われ、他のコンポーネントは作成されません。
  3. 他の可能な実装を依存関係として受け取る特定のコンポーネントのラッパー実装を作成し、コンポーネントは実行時に適切な実装に委譲します。

各ケースの配線を非常に狭く構築しており、選択したモジュールに含まれていないモジュールやクラスのアダプターをロードしていないため、#1 をお勧めします。#2.1 は、#2 とは異なり、割り当てが最小限であるため、2 番目の選択肢です。他のものは本当にランタイムをかなり重くし、無駄なクラスのロードとインスタンス化/割り当てをもたらします。

于 2013-09-16T02:38:37.710 に答える