【问题标题】:Dagger 2: Gradle module dependency with implementation in another moduleDagger 2:Gradle 模块依赖与另一个模块中的实现
【发布时间】:2016-07-08 05:26:46
【问题描述】:

我正在尝试建立一个项目,其中有两个模块 common-libapp

lib 模块有自己的 Dagger 组件和模块,它应该与风格无关。

现在,部分依赖于模块app 中声明的风味特定资源值,因此我尝试通过接口抽象组件并覆盖其在模块app 中的实现。

Dagger 模块在common-lib gradle 模块中声明,满足与 NoOp 实现的依赖关系。

    @Module
public class NetworkConfigModule {
    @Provides
    @Singleton
    HeaderParams providesHeaderParams(NoOpHeaderParams noOpHeaderParams){
        return noOpHeaderParams;
    }

    @Provides
    @Singleton
    AppHostsProvider providesAppHostsProvider(NoOpAppHostsProvider noOpAppHostsProvider){
        return noOpAppHostsProvider;
    }
}

Dagger 模块在app gradle 模块中声明,满足与实际实现的依赖关系。

@Module
public class NetworkConfigModule {

    @Provides
    @ApplicationScope
    HeaderParams providesHeaderParams(KaufdaHeaderParams kaufdaHeaderParams){
        return kaufdaHeaderParams;
    }

    @Provides
    @ApplicationScope
    AppHostsProvider providesAppHostsProvider(KaufdaAppHostsProvider implementation){
        return implementation;
    }
}

这不起作用,因为 Dagger 只是没有覆盖 Module 类,但这是意料之中的。

我的问题是,如何设置我的 Dagger 模块,以便可以在 common-lib 中使用 AppHostsProviderAppHostsProvider 接口,但我将它们的实现注入到 app 中。

【问题讨论】:

    标签: android gradle dependency-injection dagger-2


    【解决方案1】:

    最简单的方法是在您的app 中处理组件创建。

    在您的应用中,您知道要使用的实际模块和类。如果您在那里创建组件,您只需将正确的模块添加到组件中,注入您的 common-lib 类即可完成。


    如果您不想在应用中处理注入,则需要定义一个接口,例如

    interface NetworkComponentHolder {
        NetworkComponent getNetworkComponent();
    }
    

    然后你可以在app 中使用Application 来实现。同样,您必须在 app 中创建组件和模块,然后您可以从您的模块中调用

    ((NetworkComponentHolder) getApplication()).getNetworkComponent().inject(this);
    

    这将是不使用反射的两种可能性。

    【讨论】:

    • 嘿大卫,谢谢你的回答,听起来不错,但我仍然在努力把你第二个建议的每一部分都放在一边……如果 NetworkComponentHolder 和 NetworkComponent 都在 common-lib gradle 模块中,我不是因为无法提供它们的依赖项的实现而面临同样的问题吗?
    • @mdelolmo 你可以让应用程序实现接口,然后你可以在库中获取应用程序的引用,并通过接口访问组件。这是如果您需要在模块中的某个位置调用component.inject(this)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    相关资源
    最近更新 更多