【发布时间】:2022-01-05 20:49:22
【问题描述】:
我正在尝试让多个匕首模块共享一个公共模块,其中公共模块需要根据包含它的模块访问不同的字符串。
请注意,尽管在下面的示例代码中,我传递的是单个字符串(为简单起见),但实际上我想传递多个字符串
// The shared module
@Module()
public final class SharedModule {
@Provides @Singleton
public static SomeClass(String moduleSpecificString) {
return new SomeClass(moduleSpecificString);
}
}
// Two modules trying to use the shared module, but where each
// module needs the shared module to be using a slightly different
// parameter
@Module(includes = {SharedModule.class))
public final class ModuleA {
@Provides @Singleton
public static String moduleTextA() {
return "ModuleA"
}
}
@Module(includes = {SharedModule.class))
public final class ModuleB {
@Provides @Singleton
public static String moduleTextA() {
return "ModuleB"
}
}
目前我发现的两个潜在解决方案是:
- 改用@BindsInstance 在组件构建器中指定字符串
但这有将这些硬编码字符串移出模块的缺点(这意味着每个尝试仅构建模块的测试现在也必须声明这些字符串)
- 在 ModuleA 和 ModuleB 中使用 @IntoMap 将字符串插入到映射中。
这让我可以使用同一个映射来传递多个字符串,但似乎我放松了 dagger 的编译时检查,以确保我关心的映射中的每个键实际上都定义了一个值。
还有更好的选择吗?
【问题讨论】: