首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匕首2:分级模块依赖于另一个模块中的实现

匕首2:分级模块依赖于另一个模块中的实现
EN

Stack Overflow用户
提问于 2016-03-21 15:43:07
回答 1查看 1.3K关注 0票数 0

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

lib模块有它自己的Dagger组件和模块,并且应该是与味道无关的。

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

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

代码语言:javascript
复制
    @Module
public class NetworkConfigModule {
    @Provides
    @Singleton
    HeaderParams providesHeaderParams(NoOpHeaderParams noOpHeaderParams){
        return noOpHeaderParams;
    }

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

匕首模块在app级模块中声明,满足了与实际实现的依赖关系。

代码语言:javascript
复制
@Module
public class NetworkConfigModule {

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

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

这不起作用,因为Dagger只是不覆盖Module类,但这在某种程度上是预期的。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-21 16:57:07

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

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

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

代码语言:javascript
复制
interface NetworkComponentHolder {
    NetworkComponent getNetworkComponent();
}

然后,您可以使用Applicationapp中实现它。同样,您必须在app中创建组件和模块,但是可以从模块中调用

代码语言:javascript
复制
((NetworkComponentHolder) getApplication()).getNetworkComponent().inject(this);

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36135529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档