Dagger 2 - 注入非Android类

时间:2017-09-19 10:27:54

标签: java android dagger-2

我在我的Android应用中恭维Dagger 2。我按以下方式设置它:

AppComponent.java

@Singleton
@Component(modules = {
  AndroidInjectionModule.class,
  AndroidSupportInjectionModule.class,
  ActivityBuilder.class,
  AppModule.class,
  DataBaseDaoModule.class
})

public interface AppComponent {
  @Component.Builder
  interface Builder {
    @BindsInstance
    Builder application(Application aApplication);

    AppComponent build();
  }

  Application application();
  void inject(MyApplication aApplication);
}

AppInjector.java

ublic class AppInjector {

  public static void init(MyApplication aApplication) {

    //Initialize dagger and inject the aApplication
    DaggerAppComponent.builder().application(aApplication).build().inject(aApplication);

    aApplication.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
      @Override
      public void onActivityCreated(Activity aActivity, Bundle aBundle) {
        handleActivity(aActivity);
      }

      @Override
      public void onActivityStarted(Activity aActivity) {
      }

      @Override
      public void onActivityResumed(Activity aActivity) {
      }

      @Override
      public void onActivityPaused(Activity aActivity) {
      }

      @Override
      public void onActivityStopped(Activity aActivity) {
      }

      @Override
      public void onActivitySaveInstanceState(Activity aActivity, Bundle aBundle) {
      }

      @Override
      public void onActivityDestroyed(Activity aActivity) {
      }
    });
  }

  private static void handleActivity(Activity aActivity) {
    if (aActivity instanceof HasActivityInjector) {
      AndroidInjection.inject(aActivity);
      Timber.d("injected Activity");
    }
    if (aActivity instanceof FragmentActivity) {
      ((FragmentActivity) aActivity).getSupportFragmentManager()
        .registerFragmentLifecycleCallbacks(
          new FragmentManager.FragmentLifecycleCallbacks() {
            @Override
            public void onFragmentCreated(FragmentManager fm, Fragment f,
                                          Bundle savedInstanceState) {
              if (f instanceof Injectable) {
                Timber.d("injected Fragment");
                AndroidSupportInjection.inject(f);
              }
            }
          }, true);
    }
  }
}

AppModule.java

Module(includes = ViewModelModule.class)
class AppModule {

  @Singleton
  @Provides
  ApiService providesApiService(OkHttpClient aClient, MyInterceptor aInterceptor) {

    //Build a Retrofit object here
  }

  @Singleton
  @Provides
  OkHttpClient providesOkHTTPClient(MyInterceptor aInterceptor) {
   //Setup OKHTTP here
  }
}

最后在onCreate方法中的 MyApplication.Java 中,我只是像AppInjector那样调用AppInjector.init(this);Activities, Fragments and ViewModels

所有这些工作以及我在AppComponent的模块中放入的任何内容,我都可以注入utility

但是,我需要一个Application类,这取决于contexManager - 我在不同的地方使用实用程序类。或者我将有一个Activities, Fragments and ViewModels类,它取决于Application,或者需要来自AppModule的东西。但是,因为我在utility之外使用这些类,所以我不能只注入。我如何为我的UtilityComponent类提供其依赖项和任何其他类型的类 - 比如经理类?

我的第一个想法是创建一个ManagerCompoentAppModuel种类,但我不知道如何让它们在AppComponent或{{{}}中使用任何内容1}}。

1 个答案:

答案 0 :(得分:8)

请不要只使用aa, bb。始终更喜欢构造函数注入,或者从可以执行其他设置步骤的模块提供构造函数注入。 numpy适用于您无法访问构造函数的Framework组件。

  

我的第一个想法是创建一个UtilityComponent和一个ManagerCompoent,但是我不知道如何让他们在AppModuel或我的AppComponent中使用它们。

您不需要单独的组件。见下文。

  

但是,由于我在Activities,Fragments和ViewModels之外使用这些类,我不能只注入。

这与注射无关。您正在谈论范围,听起来您的实用程序是component.inject(myObject)。您的.inject(myObject)是一个@Singleton范围的组件,因此它也可用于提供您的工具。

  

但是,我需要一个实用程序类,这取决于AppComponent@Singleton

如果他们是可以访问您的应用程序的Application组件的一部分,也可以在其他任何地方提供。无需更多组件或任何东西。只需声明您的依赖关系,不要过度思考它。

只需声明你的util,用context注释它,并用@Singleton标记构造函数以进行构造函数注入。 @Singleton确保由@Inject提供,并可以访问其所依赖的@Singleton

AppComponent

然后你可以将它注入你的活动,片段甚至其他工具......

Application

您可以将其中一个或两个注入您的活动或片段......

@Singleton public class MyUtil {

  private Application application;

  @Inject public MyUtil(Application application) {
    this.application = application;
  }

}

需要任何模块,提供方法或组件来提供简单的类。只需确保添加正确的范围!