web-dev-qa-db-ja.com

非アクティビティでの短剣2注入Javaクラス

私はDIにDagger2を使用しようとしていますが、onCreateライフサイクルイベントがあるアクティビティ/フラグメント関連のクラスでは完全に正常に機能します。これで、単純なJava注入したいクラスがあります。それを実行する方法についてのアイデアはありがたいです。私が持っているコードは次のようになります:

BasicMoviesUsecaseComponent.Java-

@PerActivity
@Component(dependencies = AppComponent.class, modules = BasicMoviesUsecasesModule.class)
public interface BasicMoviesUsecasesComponent {
    void inject(PaymentsManager paymentsManager);
}

DatabaseModule.Java-

    @Module
    public class DatabaseModule {
       @Provides @Singleton
       Realm provideRealmInstance(Context context) {

           return Realm.getInstance(context);
       }

       @Provides @Singleton
       DatabaseProvider provideDatabaseInstance(Realm realm) {

           return new DatabaseProvider(realm);
       }

       @Provides @Singleton
       SharedPreferences provideSharedPrefs(Context context) {

            return context.getSharedPreferences(context.getPackageName()+"_prefs", Context.MODE_PRIVATE);
       }

       @Provides @Singleton
       SharedPreferencesManager provideSharedPreferencesManager(SharedPreferences sharedPreferences) {
            return new SharedPreferencesManager(sharedPreferences);
       }

        @Provides @Singleton
        PaymentsManager providePaymentsManager(SharedPreferencesManager sharedPreferencesManager) {

              return new PaymentsManager(sharedPreferencesManager);

        }

}

AppComponent.Java-

  @Singleton
  @Component(modules = {
    ApplicationModule.class,
    DomainModule.class,
    DatabaseModule.class
   })

public interface AppComponent {

    Bus bus();
    Realm realm();
    DatabaseProvider dbProvider();
    SharedPreferencesManager sharedPreferencesManager();
}

SharedPreferencesManagerを挿入する必要があるクラスは次のとおりです。これを行うことができません。

MyManager.Java-

 private class MyManager {
    private SharedPreferencesManager manager;

    @Inject
    MyManager(SharedPreferencesManager manager){
          this.manager = manager;           
    } 

    private void initializeDependencyInjector() {

          BMSApplication app = BMSApplication.getInstance();

          DaggerBasicMoviesUsecasesComponent.builder()
                 .appComponent(app.getAppComponent())
                 .basicMoviesUsecasesModule(new BasicMoviesUsecasesModule())
                 .build().inject(PaymentsManager.this);
    }

}

InitializeDependencyInjector()を呼び出すにはどうすればよいですか?

22
Adnan Mulla

通常、可能な限りコンストラクター注入を使用する必要があります。 component.inject(myObject)の呼び出しは、ほとんどの場合、自分でインスタンス化できないオブジェクト(アクティビティやフラグメントなど)に使用されます。

コンストラクターの注入は、基本的にはすでに行ったことです。

private class MyManager {
    private SharedPreferencesManager manager;

    @Inject
    MyManager(SharedPreferencesManager manager){
          this.manager = manager;           
    } 
}

Daggerがオブジェクトを作成し、SharedPreferencesManagerを渡します。 initなどを呼び出す必要はありません。

実際の問題は、どのように取得MyManagerのオブジェクトを取得するかです。これを行うには、もう一度、daggerが処理します。

コンストラクタに@Injectの注釈を付けることにより、ダガーにそのタイプのオブジェクトを作成する方法を伝えます。それを使用するには、単にそれを注入するか、依存関係として宣言します。

private class MyActivity extends Activity {
    @Inject
    MyManager manager;

    public void onCreate(Bundle savedState){
        component.inject(this);  
    } 
}

または、コンポーネントにゲッターを追加するだけです(SharedPreferenceManagerを提供できる限り、MyManagerもインスタンス化できます)。

@Component(dependencies = SharedPreferenceManagerProvidingComponent.class)
public interface MyComponent {

    MyManager getMyManager();
}
44
David Medenjak