gpt4 book ai didi

java - Dagger 2 - 注入(inject)非 Android 类

转载 作者:太空宇宙 更新时间:2023-11-03 12:03:10 24 4
gpt4 key购买 nike

我正在我的 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
}
}

最后在 MyApplication.Java 中的 onCreate 方法中,我只是像这样调用 AppInjector:AppInjector.init(this );

所有这些都有效,我放入 AppComponent 模块中的任何内容,我都可以注入(inject)到 Activities、Fragments 和 ViewModels 中。

但是,在某些情况下,我需要一个 utility 类,它依赖于 Application,用于 contex - 我使用该实用程序在不同的地方上课。或者我将有一个 Manager 类,它依赖于应用程序,或者需要来自 AppModule 的某些东西。但是,由于我在 Activities、Fragments 和 ViewModels 之外使用这些类,所以我不能直接注入(inject)。我将如何为我的 utility 类提供它们的依赖项和任何其他类型的类——比如管理器类?

我的第一个想法是创建一个 UtilityComponent 和一个 ManagerCompoent 之类的,但是我不知道如何让它们与 AppModuel 中的任何东西一起工作 或通过我的 AppComponent

最佳答案

请不要只对所有内容使用 component.inject(myObject)。始终喜欢构造函数注入(inject)或从可以执行其他设置步骤的模块中提供它。 .inject(myObject) 适用于您无权访问构造函数的框架组件。

My first thought was to create a UtilityComponent and a ManagerCompoent of sorts, however I have no idea how I would get them to work with anything in AppModuel or through my AppComponent.

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

However, since I use these classes outside of Activities, Fragments and ViewModels I cannot just inject.

这与注入(inject)无关。你在谈论范围,听起来你的实用程序是 @Singleton。您的 AppComponent 是一个 @Singleton 作用域组件,因此它也可用于提供您的实用程序。

However, I have cases where I would need a utility class, that depends on Application, for context

如果它们是可以访问您的应用程序的 @Singleton 组件的一部分,那么它们也可以在其他任何地方提供。不需要更多的组件或任何东西。只需声明您的依赖关系,不要想太多。


只需声明您的 util,用 @Singleton 注释它并用 @Inject 标记构造函数以进行构造函数注入(inject)。 @Singleton 确保它将由您的 AppComponent 提供,并且可以访问它所依赖的 Application

@Singleton public class MyUtil {

private Application application;

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

}

然后您可以将它注入(inject)到您的 Activity、Fragments 中,甚至注入(inject)到其他实用程序中....

@Singleton public class MyUtilWrapper {

private MyUtil myUtil;

@Inject public MyUtilWrapper(MyUtil myUtil) {
this.myUtil = myUtil;
}

}

您可以将其中一个或两者注入(inject)到您的 Activity 或 fragment 中...

@Inject MyUtil myUtil;
@Inject MyUtilWrapper myUtilWrapper;

void onCreate(..) {
AndroidInjection.inject(this);
}

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

关于java - Dagger 2 - 注入(inject)非 Android 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46298107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com