2016-02-24 18 views
11

Sto cercando di utilizzare Dagger2 per DI, funziona perfettamente per le classi correlate a Attività/frammento in cui è presente un evento ciclo di vita onCreate. Ora ho una semplice classe Java che voglio iniettare. Qualsiasi idea su come procedere sarebbe apprezzata. Il codice che ho è simile al seguente:Iniezione Dagger 2 in classe Java non attiva

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

Ecco la classe I è necessario iniettare SharedPreferencesManager in e non riesco a farlo:

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); 
    } 

} 

Come chiamare initializeDependencyInjector()?

risposta

28

Generalmente si dovrebbe utilizzare l'iniezione del costruttore quando possibile. La chiamata a component.inject(myObject) è principalmente da utilizzare per oggetti che non è possibile istanziare da soli (come attività o frammenti).

iniezione Constructor è fondamentalmente ciò che hai già fatto:

private class MyManager { 
    private SharedPreferencesManager manager; 

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

Dagger creerà l'oggetto per voi e passare il vostro SharedPreferencesManager. Non è necessario chiamare init o qualcosa di simile.

La vera domanda è come ottenere un oggetto di MyManager. Per farlo, di nuovo, il pugnale lo gestirà per te.

Annotando il costruttore con @Inject si dice a pugnale come può creare un oggetto di quel tipo. Per usarlo, è sufficiente iniettarlo o dichiararlo come dipendenza.

private class MyActivity extends Activity { 
    @Inject 
    MyManager manager; 

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

O semplicemente aggiungere un getter ad un componente (a patto che può essere fornito SharedPreferenceManager, MyManager può anche essere istanziato):

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

    MyManager getMyManager(); 
} 
+0

Grazie mille, ha lavorato come un fascino! –

+0

Grazie per l'aiuto. Aiuta davvero. –

+0

Come verrà soddisfatta questa dipendenza? SharedPreferencesManager manager'? –

Problemi correlati