gpt4 book ai didi

android - 基于构建类型和风格的更好的 Dagger 依赖注入(inject)?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:58:39 26 4
gpt4 key购买 nike

我正在使用方法为这个问题的回答中描述的 Dagger 提供模块 Android Customize Workflow for Product Flavors

我们的方法有点不同 - 我们在 debug 构建类型中有 Modulessrc/debug/javarelease 中src/release/java 中构建类型。我们的主模块称为 ApplicationModule,它包括所有其他模块。

src/debug/java 中的 Modules 为调试、日志记录等提供了一些自定义行为,并覆盖了 ApplcationModule

现在我们需要具有基于应用程序风格的自定义行为。

这样做的正确方法是什么?

例如, flavor A 到 C 应该提供自定义行为,而 flavor D 到 F 应该提供基本的默认行为。

到目前为止我想出了这样的。

  • 所有风格(不是构建类型)在 src/flavorX/java/com.application.FlavorModule 中都有相同的类
  • 为避免代码重复,只有风格 A 到 C 提供自定义行为,而其他风格则完全为空,以便项目可以编译。我的模块在 src/main/java
  • 中提供了默认行为

有没有更好的方法可以达到这样的效果?因为我不喜欢空的 src/flavorX/java/com.application.FlavorModule 也不喜欢代码重复...

最佳答案

有点复杂,但我是这样做的:

创建一个接口(interface) MainComponent 并将其保存在 src/main 中,这应该包含任何非特定风格的内容

public interface MainComponent {
void inject(MyApplication o);

void inject(BusinessObject o);

Foo getFoo();

Activitycomponent plusActivityComponent(ActivityModule activityModule);

在每个风格中创建一个继承自上述接口(interface)的接口(interface)

public interface FlavorComponent extends MainComponent {
//flavor specific injection stuff similar to SourceComponent
}

在 Debug/Beta/Release 中创建实际组件并扩展 FlavorComponent(为您提供所有 flavor 特定的细节)。

@Singleton
@Component(modules = {ApplicationModule.class, FlavorModule.class,
BetaApplicationModule.class, AnotherModuleJustBecause.class})
public interface ApplicationComponent extends FlavorComponent {
void inject(NYTApplication a);

}

请注意,您还可以包含特定 flavor 的 FlavorModule,它在每种 flavor 中可能不同,或者不包含在 Release 中,而包含在 Beta 中。

还在 Debug/Beta/Release 中包含一个 ComponentFactory,返回通用的 Flavor 组件接口(interface)

public class ComponentFactory {

public static final FlavorComponent getComponent(Application context) {
return DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(context))
.build();
}

最后从您的应用程序类调用:

ComponentFactory.getComponent(this).inject(this);

组件工厂将返回将扩展 Flavor 组件的构建类型组件。

关于android - 基于构建类型和风格的更好的 Dagger 依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21712782/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com