1

基本的に単一のアプリのホワイトラベルである製品フレーバーがたくさんあるアプリがあります。ただし、クライアントがわずかに異なるものを求めているため、一部のフレーバーでメイン フローから逸脱することがあります。これまでのところ、これらのケースのコードを編集し、スパゲッティ コード (多くの if と else) を使用して、他のアプリが壊れないようにしています。言うまでもなく、これは非常にスケーラブルな (またはまともな) 方法ではありません。

1 つのオプションは、アクティビティ クラスを productFlavor ソース フォルダーsrc/flavor1/java/AnActivity.java( src/flavor2/java/AnActivity.java、 など) に書き込むことです。productFlavor コードはクラスをオーバーライドできないためsrc/main、カスタマイズがない場合でも、新しいフレーバーごとに同じクラスをコピーする必要があります。私はこのオプションがあまり好きではありません。その結果、多くの冗長なコードが発生し、クラス名はもはやそれほど説明的ではなくなります。別のことをしている可能性がある場合でも、他のクラスをオーバーライドするには、すべて同じ名前にする必要があるためです。

Dagger別のオプションは、さまざまな実装のインテントを構築しObjectGraphて注入するようなものを使用することです。たとえば、 の場合flavor1、ボタン X がクリックされると、 のインテントActivityAが注入され、 の場合flavor2、 のインテントActivityBが注入されます。

これはこれを行うためのより良い方法のように思えますが、デフォルトでバインディングをオーバーライドするクラスを実装する方法がまだわかりませんObjectGraph

実装やその他のオプションに関するアイデアはありますか? 依存関係の挿入とテストをDagger調べ始めたところなので、他のフレームワークも同様に機能します。

4

1 に答える 1

5

これが私がすることです...

src/flavor1/java/com/myapp/Modules.java

public class Modules {
  public static Object[] get(Application app) {
    return new Object[] {
      new MyAppModule(app),
      new Flavor1Module(app)
    };
  }
}

src/flavor2/java/com/myapp/Modules.java

public class Modules {
  public static Object[] get(Application app) {
    return new Object[] {
      new MyAppModule(app),
      new Flavor2Module(app)
    };
  }
}

src/main/java/com/myapp/MyAppApplication.java

ObjectGraph og = ObjectGraph.create(Modules.get(this));

MyAppModule共通の依存関係があります。追加の依存関係を提供したり、 ifから依存関係をオーバーライドしたりできFlavor1Moduleます。Flavor2ModuleMyAppModuleoverrides=true

于 2013-10-13T03:20:29.067 に答える