2016-11-14 106 views
2

因此,我使用Dagger 2作为Android应用程序,但让我试着解释我的问题,而没有Android术语。匕首2一个控制器,依赖于两个范围内的组件

简而言之,我有一个显示UI的控制器。为了用合适的单位显示适当的值,该控制器需要依赖两个范围内的组件,这是不可能的。

这里是这样:我有

  • 一个控制器组件,作用域与@Activity
  • One应用Comonent,与@Singleton作用域
  • 一个DbComponent - 数据库部件,与作用域@Application,它依赖于ApplicationComponent。
  • One PreferencesComponent - 同样是组件,其范围为@Application并依赖于ApplicationComponent。

的ControllerComponent需要靠两个DbComponent,所以我的控制器可以得到具有要显示的数据,并在PreferencesComponent来显示适当的单位(摄氏,华氏,米/秒,公里/小时等等)。

什么是实现我的图形的最佳方式?

我看到的问题,与我相似,但他们并没有帮助 - question 1question 2

+1

大多数这些 “部件” 的应该是模块。这就是为什么它不起作用。阅读更多:http://stackoverflow.com/questions/40545075/dagger2-and-android/40546157#40546157 – EpicPandaForce

+0

你是否告诉我遵循某种“每个范围的一个组件”模式或其他?我认为这个问题部分是哲学的。为什么(例如)一个DbComponent应该只是一个模块,而像networkcomponent这样的东西应该在一个单独的组件中而不是另一个模块中? – definera

+0

网络组件也是单身作用域,不是吗?那么它应该是一个模块,是单件组件的一部分。如果你看到这个答案,'NetworkingComponent'只是一个普通的'公共接口',其中的提供方法,而不是一个实际的组件。 – EpicPandaForce

回答

3

一个控制器组件,与@Activity

One应用Comonent范围的,具有@Singleton

作用域

One DbComponent - 一个数据库组件,使用@Application进行作用域,它依赖于ApplicationComponent。

One PreferencesComponent - 再次组件,使用@Application作用域并依赖于ApplicationComponent。

在现实中,a component should exist per scope

所以,你应该有两个部分组成:

1)ApplicationComponent,标有@Singleton

@Singleton 
@Component(modules={DbModule.class, PreferencesModule.class, AppModule.class}) 
public interface ApplicationComponent { 
    // provision methods 
} 

2)ControllerComponent,标有@Activity

@Activity 
@Component(dependencies={ApplicationComponent.class}, modules={ControllerModule.class}) 
public interface ControllerComponent extends ApplicationComponent { 
    // provision methods 
}