Dagger 2:Gradle 模块依赖与另一个模块中的实现
Dagger 2: Gradle module dependency with implementation in another module
我正在尝试建立一个项目,其中有两个模块 common-lib
和 app
。
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 不会覆盖模块 class,但这是意料之中的事情。
我的问题是,如何设置我的 Dagger 模块,以便我可以在 common-lib
中使用 HeaderParams
和 AppHostsProvider
接口,但我将它们的实现注入 app
].
最简单的方法是只处理 app
中的组件创建。
在您的应用程序中,您知道要使用的实际模块和 类。如果您在那里创建组件,您只需将正确的模块添加到组件中,注入您的 common-lib
类 即可完成。
如果您不想在应用中处理注入,则需要定义一个接口,例如
interface NetworkComponentHolder {
NetworkComponent getNetworkComponent();
}
然后您可以在 app
中使用 Application
实施。同样,您必须在 app
中创建组件和模块,但随后您可以从您的模块中调用
((NetworkComponentHolder) getApplication()).getNetworkComponent().inject(this);
这是不使用反射的两种可能性。
我正在尝试建立一个项目,其中有两个模块 common-lib
和 app
。
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 不会覆盖模块 class,但这是意料之中的事情。
我的问题是,如何设置我的 Dagger 模块,以便我可以在 common-lib
中使用 HeaderParams
和 AppHostsProvider
接口,但我将它们的实现注入 app
].
最简单的方法是只处理 app
中的组件创建。
在您的应用程序中,您知道要使用的实际模块和 类。如果您在那里创建组件,您只需将正确的模块添加到组件中,注入您的 common-lib
类 即可完成。
如果您不想在应用中处理注入,则需要定义一个接口,例如
interface NetworkComponentHolder {
NetworkComponent getNetworkComponent();
}
然后您可以在 app
中使用 Application
实施。同样,您必须在 app
中创建组件和模块,但随后您可以从您的模块中调用
((NetworkComponentHolder) getApplication()).getNetworkComponent().inject(this);
这是不使用反射的两种可能性。