web-dev-qa-db-fra.com

Injection Dagger 2 dans non Activity Java class

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 ()?

22
Adnan Mulla

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();
}
44
David Medenjak