Android 基于构建类型和风格的更好的匕首依赖注入?
我正在使用aproach提供模块,以便在回答此问题时使用Dagger 我们的方法有点不同-我们在Android 基于构建类型和风格的更好的匕首依赖注入?,android,dagger,Android,Dagger,我正在使用aproach提供模块,以便在回答此问题时使用Dagger 我们的方法有点不同-我们在src/debug/java和release的buildtype中有Modules,在src/release/java中有buildtype。我们的主要模块称为ApplicationModule,它包括所有其他模块 src/debug/java中的Modules为调试、记录等提供了一些自定义行为,并覆盖ApplcationModule 现在我们需要有基于应用程序风格的定制行为 正确的做法是什么 例如,
src/debug/java
和release
的buildtype中有Modules
,在src/release/java
中有buildtype。我们的主要模块称为ApplicationModule
,它包括所有其他模块
src/debug/java
中的Modules
为调试、记录等提供了一些自定义行为,并覆盖ApplcationModule
现在我们需要有基于应用程序风格的定制行为
正确的做法是什么
例如,口味A到C应该提供自定义行为,而口味D到F应该提供基本的默认行为
到目前为止,我提出了这样的建议
- 在
src/flavorX/java/com.application.FlavorModule
- 为了避免代码重复,只有从A到C的风格提供自定义行为,而其他风格完全为空,以便项目能够编译。默认行为由我的模块在
src/main/java
有没有更好的方法来达到这样的效果?因为我不喜欢空的src/flavorX/java/com.application.FlavorModule
,也不喜欢代码复制…有点复杂,但我是这样做的:
创建一个接口MainComponent并将其保存在src/main中,它应该包含任何不特定于味道的内容
public interface MainComponent {
void inject(MyApplication o);
void inject(BusinessObject o);
Foo getFoo();
Activitycomponent plusActivityComponent(ActivityModule activityModule);
}
在每个风格中创建一个继承自上述风格的接口
public interface FlavorComponent extends MainComponent {
//flavor specific injection stuff similar to SourceComponent
}
在Debug/Beta/Release中创建实际的组件并扩展FlavorComponent(提供所有特定于味道的细节)
请注意,您还可以包含一个特定于味道的味道模块,该模块可以在每个味道中有所不同,也可以在版本中不包含它,而在测试版中包含它
在Debug/Beta/Release中还包括一个组件工厂,返回通用风格的组件接口
public class ComponentFactory {
public static final FlavorComponent getComponent(Application context) {
return DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(context))
.build();
}
最后,从应用程序类调用:
ComponentFactory.getComponent(this).inject(this);
组件工厂将返回构建类型的组件,该组件将扩展Flavor的组件。我的解决方案是对上述内容的改编
我在src/main中有一个接口调用ApplicationComponent:
@Singleton
@Component(modules = [
FlavorModule::class,
Anyothermoduleyouhave::class
])
interface ApplicationComponent {}
现在,在每个flavor文件夹中,您必须创建2个文件:
FlavorModule(用于调用配置的抽象类)
FlavorConfig(配置或任何您需要的特定风味代码)
顺便说一下:如果您没有任何源文件夹,可以通过在gradle文件中添加以下内容来创建:
java.srcDirs += ['src/main/kotlin', 'src/myFlavorCode/kotlin']
以及创建kotlin文件夹
课程模块:
@Module
class FlavorModule {
@[Provides Singleton]
fun getConfig(config: MySpecificFlavor1Config): FlavorConfig
}
风味配置
class MySpecificFlavor1Config @Inject constructor() : FlavorConfig {
override fun getMyValueThatImLookingFor() = "flavor 1 woooooow"
}
对味2做同样的处理
重要提示:要使用dagger动态执行此操作,请对两者使用相同的包路径
FlavorModule/FlavorConfig类,如包br.com.main.config,这样dagger就知道要使用哪个FlavorModule
查看您的ComponentFactory
,我不明白您的最后一行代码为什么不是ComponentFactory.getComponent(this.inject)(this)
。你能解释一下吗?读这篇文章可能会更清楚:检查这个项目我真的不明白为什么我们需要使用抽象类
,抽象乐趣
和@[Binds Singleton]
作为风味模块。如果我们只使用类
,乐趣
和@分别提供
class MySpecificFlavor1Config @Inject constructor() : FlavorConfig {
override fun getMyValueThatImLookingFor() = "flavor 1 woooooow"
}