我在我的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
类,这取决于contex
,Manager
- 我在不同的地方使用实用程序类。或者我将有一个Activities, Fragments and ViewModels
类,它取决于Application,或者需要来自AppModule的东西。但是,因为我在utility
之外使用这些类,所以我不能只注入。我如何为我的UtilityComponent
类提供其依赖项和任何其他类型的类 - 比如经理类?
我的第一个想法是创建一个ManagerCompoent
和AppModuel
种类,但我不知道如何让它们在AppComponent
或{{{}}中使用任何内容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;
}
}
你不需要任何模块,提供方法或组件来提供简单的类。只需确保添加正确的范围!