2016-02-24 12 views
11

Próbuję użyć Dagger2 dla DI, działa idealnie dla klas związanych z działaniami/fragmentami, w których występuje zdarzenie cyklu życia onCreate. Teraz mam zwykłą klasę Java, którą chcę wstrzyknąć. Wszelkie sugestie, jak to zrobić, będą mile widziane. Kod mam wygląda następująco:Wstrzykiwanie sztyletu 2 w nieczynnej klasie 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(); 
} 

Tutaj jest klasa I trzeba wstrzyknąć SharedPreferencesManager i nie mogę tego zrobić:

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

} 

Jak mogę zadzwonić initializeDependencyInjector()?

Odpowiedz

28

Powinieneś zazwyczaj używać iniekcji konstruktora, gdy tylko jest to możliwe. Wezwanie do component.inject(myObject) jest najczęściej używane do obiektów, których nie możesz sam utworzyć (takie jak działania lub fragmenty).

wtrysk Konstruktor jest w zasadzie to, co już zrobiłem:

private class MyManager { 
    private SharedPreferencesManager manager; 

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

Dagger stworzy obiekt dla siebie i przechodzą w SharedPreferencesManager. Nie ma potrzeby wywoływania init lub czegoś podobnego.

Prawdziwe pytanie brzmi, jak uzyskać uzyskać obiekt obiektu MyManager. Aby to zrobić, sztylet z pewnością sobie z tym poradzi.

Umieszczając opis konstruktora przy pomocy @Inject, mówisz sztyletowi, jak można utworzyć obiekt tego typu. Aby go użyć, po prostu wstrzyknij lub zadeklaruj to jako zależność.

private class MyActivity extends Activity { 
    @Inject 
    MyManager manager; 

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

Lub po prostu dodać getter do komponentu (o ile SharedPreferenceManager mogą być dostarczone, MyManager może również być instancja):

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

    MyManager getMyManager(); 
} 
+0

Dziękuję bardzo, pracował jak urok! –

+0

Dziękuję za pomoc. To naprawdę pomaga. –

+0

Jak ta zależność będzie spełniona 'Menedżer SharedPreferencesManager'? –

Powiązane problemy