android – Dagger模块包含周期

android – Dagger模块包含周期,第1张

概述我还是Dagger的新手并试图抓住一些东西.我想将我的模块分成逻辑组,每个组都提供自己的功能,但基本上就像在一个模块中一样. 例如,假设我的主应用程序模块定义如下: //com.example.android.MyAppModule.java@Module( includes = AnalyticsModule.class, injects = { <snip> })public 我还是Dagger的新手并试图抓住一些东西.我想将我的模块分成逻辑组,每个组都提供自己的功能,但基本上就像在一个模块中一样.

例如,假设我的主应用程序模块定义如下:

//com.example.androID.MyAppModule.java@Module(   includes = AnalyticsModule.class,injects = { <snip> })public class MyAppModule {   // varIoUs provIDes}

我有另外一个这样定义的模块,它设置一个ErrorReporter接口并为其提供具体的实现.

// com.example.androID.analytics.AnalyticsModule.java@Module(   addsTo = MyAppModule.class,injects = { MyApp.class })public class AnalyticsModule(){    // ErrorReporter is a public interface and ErrorReporterImpl is a package-local final concrete class that implements it    @ProvIDes @Singleton    ErrorReporter provIDesErrorReporter(ErrorReporterImpl reporter) { return reporter };}

在我的Application类中,我设置了如下对象图:

// com.example.androID.MyApp.javapublic class MyApp extends Application {    @Inject ErrorReporter errorReporter;    @OverrIDe    public voID onCreate() {        super.onCreate();        applicationGraph = ObjectGraph            .create(new MyAppModule())            .plus(new AnalyticsModule());        applicationGraph.inject(this);        errorReporter.initialize();    }}

当我运行匕首编译器时,我得到这样的东西:

Graph valIDation Failed: Module Inclusion Cycle:0. com.example.androID.analytics.AnalyticsModule included by com.example.androID.MyAppModule1. com.example.androID.modules.MyAppModule included by com.example.androID.analytics.AnalyticsModule0. com.example.androID.analytics.AnalyticsModule

我在这做错了什么?我认为它与includes / addsTo有关,但当我删除它时,我得到其他错误.

如果我从MyAppModule中删除includes = AnalyticsModule.class,我会得到如下内容:

com.example.androID.analytics.ErrorReporter Could not be bound with key com.example.androID.analytics.ErrorReporter required by com.example.androID.MyApp for com.example.androID.MyAppModule

如果我完全放弃了AnalyticsModule然后将provIDeErrorReporter移交给MyAppModule,那么一切都很好,但是我必须将我的具体impl类公开,以便我可以在其他模块中使用它.

解决方法 addsTo =用于指定此图形是父/子图中引用模块的扩展. .plus()是此版本的运行时版本.如果你有较短寿命的图管理实例,你只需要.plus().这大致相当于Guice和其他DI容器中“范围”的概念.

在你的例子中,你正在做:

applicationGraph = ObjectGraph    .create(new MyAppModule())    .plus(new AnalyticsModule());

这最终会在父/子关系中创建两个图形,这不是您需要的图形.在AndroID应用程序中,您需要一个应用程序图形.

您可以简单地删除addsTo,MyAppModule将自动实例化AnalyticsModule,或者如果您想避免动态初始化,则可以将两者都传入:

applicationGraph = ObjectGraph.create(new MyAppModule(),new AnalyticsModule());

模块包含周期是因为这两个模块之间存在周期性关系,模块本身必须形成非循环的配置图. MyAppModule包括AnalyticsModule,而AnalyticsModule又包含MyAppModule. (addsTo是一个不太严格的includes =用于指定从父图获得的东西)

总结

以上是内存溢出为你收集整理的android – Dagger模块包含周期全部内容,希望文章能够帮你解决android – Dagger模块包含周期所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1138323.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存