基于构buildtypes和风格的更好的Daggerdependency injection?

我正在使用aproach向Dagger提供模块来回答这个问题。Android Customize Product Flow for Product Flavors

我们的方法有些不同 – 我们在src/debug/java中有debug构buildtypes的Modules ,在src/release/java中有release构buildtypes。 我们的主要模块被称为ApplicationModule它包括所有其他。

src/debug/java Modules为debugging,logging等提供了一些自定义的行为,并且覆盖了ApplcationModule

现在我们需要基于应用程序风格来定制行为。

什么是正确的做法呢?

例如,口味A至C应提供自定义行为,而口味D至F应提供基本的默认行为。

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

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

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

Solutions Collecting From Web of "基于构buildtypes和风格的更好的Daggerdependency injection?"

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

创build一个接口MainComponent并将其保存在src / main中,它应该包含任何不特定于风味的东西

 public interface MainComponent { void inject(MyApplication o); void inject(BusinessObject o); Foo getFoo(); Activitycomponent plusActivityComponent(ActivityModule activityModule); 

}

在每种风味中创build一个从上面inheritance的接口

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

在Debug / Beta / Release中创build实际的组件并扩展FlavorComponent(给你所有味道特定的细节)。

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

请注意,您还可以包含一个特定于风味的FlavorModule,它可以在每种风格中有所不同,也可以不包含在Release中,同时将其包含在Beta中。

在Debug / Beta / Release中包含一个ComponentFactory,返回通用的Flavor Component Interface

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

最后从你的Application类调用:

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

组件工厂将返回将扩展Flavor组件的构buildtypes组件。