非Activity Java类中的Dagger 2注入 [英] Dagger 2 injection in non Activity Java class

查看:150
本文介绍了非Activity Java类中的Dagger 2注入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将Dagger2用于DI,它对于存在onCreate生命周期事件的Activity/Fragment相关类非常有效.现在,我有一个普通的Java类,我想将其注入.任何关于如何实现它的想法将不胜感激.我的代码如下所示:

I am trying to use Dagger2 for DI, it works perfectly fine for Activity/Fragment related classes where there is a onCreate lifecycle event. Now I have a plain Java class which I want to be injected. Any ideas as to how to go about it would be appreciated. The code I have looks like this :

BasicMoviesUsecaseComponent.java-

BasicMoviesUsecaseComponent.java -

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

DatabaseModule.java-

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-

AppComponent.java -

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

public interface AppComponent {

    Bus bus();
    Realm realm();
    DatabaseProvider dbProvider();
    SharedPreferencesManager sharedPreferencesManager();
}

这是我需要将SharedPreferencesManager注入的类,但我无法这样做:

Here is the class I need to inject the SharedPreferencesManager into and I am unable to do so :

MyManager.java-

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

}

如何调用initializeDependencyInjector()?

How do I call initializeDependencyInjector() ?

推荐答案

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

You should generally use constructor injection whenever possible. The call to component.inject(myObject) is mostly to be used for objects which you can not instantiate yourself (like activities or fragments).

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

Constructor injection is basically what you already did:

private class MyManager {
    private SharedPreferencesManager manager;

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

Dagger将为您创建对象并传递您的SharedPreferencesManager.不需要调用init或类似的东西.

Dagger will create the object for you and pass in your SharedPreferencesManager. There is no need to call init or something similar.

真正的问题是如何获取一个MyManager对象.为此,匕首将再次为您处理.

The real question is how to obtain an object of MyManager. To do so, again, dagger will handle it for you.

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

By annotating the constructor with @Inject you tell dagger how it can create an object of that type. To use it, just inject it or declare it as a dependency.

private class MyActivity extends Activity {
    @Inject
    MyManager manager;

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

或仅向组件添加吸气剂(只要可以提供SharedPreferenceManager,也可以实例化MyManager):

Or just add a getter to a component (as long as SharedPreferenceManager can be provided, MyManager can also be instantiated):

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

    MyManager getMyManager();
}

这篇关于非Activity Java类中的Dagger 2注入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆