私は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()を呼び出すにはどうすればよいですか?
通常、可能な限りコンストラクター注入を使用する必要があります。 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();
}