2016-03-21 112 views
0

我想设置一个项目,其中我有两个模块common-libapp匕首2:Gradle模块依赖于在另一个模块中的实现

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; 
    } 
} 

匕首模块申报app gradle这个模块,满足实际执行的依赖。

@Module 
public class NetworkConfigModule { 

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

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

这不起作用,因为Dagger并没有重写Module类,但这是某种预期。

我的问题是,我该怎么设置我的匕首模块,所以我可以在common-lib使用HeaderParamsAppHostsProvider接口,但我在app注入它们的实现。

回答

2

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

在您的应用程序中,您知道要使用的实际模块和类。如果您在那里创建组件,您可以将正确的模块添加到该组件,注入您的类并完成。


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

interface NetworkComponentHolder { 
    NetworkComponent getNetworkComponent(); 
} 

然后反过来,你可以用你的Applicationapp实现。同样,你会在你的app创建组件和模块,但随后从你的模块,你可以调用

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

这将是2点的可能性,而无需使用反射。

+0

嗨大卫,谢谢你的回答,这听起来不错,但我仍然在努力把你的第二个建议的每一部分...... 如果NetworkComponentHolder和NetworkComponent都在'common-lib' gradle模块中,是不是我面临同样的问题,因为我不能提供他们的依赖关系的实现? – mdelolmo

+0

@mdelolmo您将使应用程序实现接口,然后您可以获得对库中应用程序的引用,并使用该接口访问该组件。这是如果你需要在你的模块中调用'component.inject(this)'某个地方 –