Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 基于构建类型和风格的更好的匕首依赖注入?_Android_Dagger - Fatal编程技术网

Android 基于构建类型和风格的更好的匕首依赖注入?

Android 基于构建类型和风格的更好的匕首依赖注入?,android,dagger,Android,Dagger,我正在使用aproach提供模块,以便在回答此问题时使用Dagger 我们的方法有点不同-我们在src/debug/java和release的buildtype中有Modules,在src/release/java中有buildtype。我们的主要模块称为ApplicationModule,它包括所有其他模块 src/debug/java中的Modules为调试、记录等提供了一些自定义行为,并覆盖ApplcationModule 现在我们需要有基于应用程序风格的定制行为 正确的做法是什么 例如,

我正在使用aproach提供模块,以便在回答此问题时使用Dagger

我们的方法有点不同-我们在
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"
        }