非活动Java类中的Dagger 2注入

Adn*_*lla 21 java android dependency-injection dagger-2

我正在尝试使用Dagger2进行DI,它对于有onCreate生命周期事件的Activity/Fragment相关类非常适用.现在我有一个普通的Java类,我想要注入它.任何关于如何去做的想法将不胜感激.我的代码看起来像这样:

BasicMoviesUsecaseComponent.java -

@PerActivity
@Component(dependencies = AppComponent.class, modules = BasicMoviesUsecasesModule.class)
public interface BasicMoviesUsecasesComponent {
    void inject(PaymentsManager paymentsManager);
}
Run Code Online (Sandbox Code Playgroud)

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

        }

}
Run Code Online (Sandbox Code Playgroud)

AppComponent.java -

  @Singleton
  @Component(modules = {
    ApplicationModule.class,
    DomainModule.class,
    DatabaseModule.class
   })

public interface AppComponent {

    Bus bus();
    Realm realm();
    DatabaseProvider dbProvider();
    SharedPreferencesManager sharedPreferencesManager();
}
Run Code Online (Sandbox Code Playgroud)

这是我需要将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);
    }

}
Run Code Online (Sandbox Code Playgroud)

我如何调用initializeDependencyInjector()?

Dav*_*jak 44

通常应尽可能使用构造函数注入.调用component.inject(myObject)主要用于无法自己实例化的对象(如活动或片段).

构造函数注入基本上就是你已经做过的:

private class MyManager {
    private SharedPreferencesManager manager;

    @Inject
    MyManager(SharedPreferencesManager manager){
          this.manager = manager;           
    } 
}
Run Code Online (Sandbox Code Playgroud)

匕首会为你创造物品并传递给你SharedPreferencesManager.无需调用init或类似的东西.

真正的问题是如何获得一个对象MyManager.为此,再次,匕首会为你处理它.

通过注释构造函数,@Inject告诉dagger如何创建该类型的对象.要使用它,只需注入它或将其声明为依赖项.

private class MyActivity extends Activity {
    @Inject
    MyManager manager;

    public void onCreate(Bundle savedState){
        component.inject(this);  
    } 
}
Run Code Online (Sandbox Code Playgroud)

或者只是将一个getter添加到组件中(只要SharedPreferenceManager可以提供,MyManager也可以实例化):

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

    MyManager getMyManager();
}
Run Code Online (Sandbox Code Playgroud)