4

Dagger 1 では、スコープ グラフの作成と現在のオブジェクトへの依存関係の注入を処理する基本クラスのセットアップがありました。例えば...

public abstract class MyBaseActivity extends Activity {
  private ObjectGraph graph;

  protected void onCreate(Bundle savedInstanceState) {
    graph = ((MyApp) getApplication()).plus(getModules());
    graph.inject(this);
  }

  protected Object[] getModules();
}

public class MyClass extends MyBaseActivity {

  @Inject SomeDep someDep;

  @Override
  protected Object[] getModules() {
    return new Object[/* Contains a module that provides SomeDep */];
  }
}

これにより、各サブクラスは、標準のアプリケーション モジュールに加えて、独自のモジュール セットを補足することができました。

Dagger 2 で遊んだ後、同様のシナリオを処理することはできないようです...

public abstract class MyBaseActivity extends Activity {
  private MyBaseActivityComponent component;

  protected void onCreate(Bundle savedInstanceState) {
    component = ((MyApp) getApplication()).component().plus(/* Can not accept an array */);
    component.inject(this);
  }
}

MyBaseActivityComponent を変更して、使用可能なすべてのモジュールをリストするように上記を回避しました...

@Subcomponent(modules = {
  Module1.class,
  Module2.class
})
public interface MyBaseActivityComponent {
  public void inject(MyBaseActivity activity);
}

だから今、私はこのようなことをすることができます...

public abstract class MyBaseActivity extends Activity {
  private MyBaseActivityComponent component;

  protected void onCreate(Bundle savedInstanceState) {
    component = ((MyApp) getApplication()).component().plus(new Module1(), new Module2());
    component.inject(this);
  }
}

しかし今、注入が MyBaseActivity の依存関係を注入するが、サブクラスではないという問題があります。提案?

4

1 に答える 1