J'essaie d'utiliser Dagger2 pour DI, cela fonctionne parfaitement pour les classes liées aux activités/fragments où il y a un événement de cycle de vie onCreate. Maintenant, j'ai une classe Java classe que je veux être injectée. Toutes les idées sur la façon de s'y prendre seraient appréciées. Le code que j'ai ressemble à ceci:
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();
}
Voici la classe dans laquelle j'ai besoin d'injecter le SharedPreferencesManager et je ne peux pas le faire:
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);
}
}
Comment appeler initializeDependencyInjector ()?
Vous devriez généralement utiliser l'injection de constructeur chaque fois que possible. L'appel à component.inject(myObject)
est principalement destiné aux objets que vous ne pouvez pas instancier vous-même (comme des activités ou des fragments).
L'injection de constructeur est fondamentalement ce que vous avez déjà fait:
private class MyManager {
private SharedPreferencesManager manager;
@Inject
MyManager(SharedPreferencesManager manager){
this.manager = manager;
}
}
Dagger créera l'objet pour vous et passera votre SharedPreferencesManager
. Il n'est pas nécessaire d'appeler init ou quelque chose de similaire.
La vraie question est de savoir comment obtenir un objet de MyManager
. Pour ce faire, encore une fois, le poignard s'en chargera pour vous.
En annotant le constructeur avec @Inject
vous dites au poignard comment il peut créer un objet de ce type. Pour l'utiliser, il suffit de l'injecter ou de le déclarer comme une dépendance.
private class MyActivity extends Activity {
@Inject
MyManager manager;
public void onCreate(Bundle savedState){
component.inject(this);
}
}
Ou ajoutez simplement un getter à un composant (tant que SharedPreferenceManager
peut être fourni, MyManager
peut également être instancié):
@Component(dependencies = SharedPreferenceManagerProvidingComponent.class)
public interface MyComponent {
MyManager getMyManager();
}