我有一個應用程序,讓我們說15個屏幕。 主要有3個,完全獨立的活動:如何使用單活動應用程序時組織Dagger2模塊和組件
LoginActivity
- 相當明顯的,有些登錄事情MainActivity
- 最大的一個,最importatTheOtherOneNotRelevantAtTheMoment
我決定用Conductor
,因爲我發現Fragment的生命週期太複雜了,對我而言Conductor
現在是「熱狗屎」
我有很多Conductor的控制器。他們大多數是XXXListController
與相應的XXXDetailController
。所有這些控制器僅在中生效內MainActivity
。這就像「單一活動應用程序」。 LoginActivity
基本上是由於來自第三方OAuths的回調,如FbLogin & Google登錄。我只是試圖使MainActivity
完全是我的 - 沒有任何其他奇怪的行爲。
爲了組織依賴關係,我決定使用Dagger2。我在Spring和JavaEE方面有着相當不錯的經驗,所以我認爲這很容易。
我認識幾個模塊,沒有任何問題:
AppModule
- 我喜歡服務器地址等應用程序相關的東西 AndroidModule
- 事情就像SharedPreferences
,Application
然後,我已經差不多「即興」以及如何組織我的觀點。這是我的本錢:
- 3其他範圍:
ActivityScope
,ControllerScope
和ServiceScope
- 不相關的。 - 各自
Controller
有它自己的對應Module
&Component
。我讀過這不是一個好主意,但我確定 - 每個Controller
都是非常獨立的,並且它有自己獨特的依賴關係。 ApplicationComponent
當然是層次結構的根源。MainActivityComponent
是的ApplicationComponent
XXXControllerComponent
一個@Subcomponent
是的MainActivityComponent
一個@Subcomponent
要注入內MainActivity
依賴我使用,我發現這個代碼很常見:
protected void injectDependencies(ApplicationComponent component) {
component.plus(new MainActivityModule(this)).inject(this);
}
的當我想爲我的Controller
創建&注入依賴關係時出現問題。
的MainActivity
如下所示:
@ActivityScope
@Subcomponent(modules = {
MainActivityModule.class
})
public interface MainActivityComponent {
XXXListComponent newXXXListComponent(XXXListModule xxxListModule);
void inject(MainActivity activity);
}
目前,典型Controller
看起來是這樣的:
@ControllerScope
@Subcomponent(modules = {
XXXListModule.class
})
public interface XXXListComponent {
void inject(XXXListController controller);
}
和相應的Module
:
@Module
public class XXXListModule {
private XXXListController listController;
public XXXListModule(XXXListController listController) {
this.listController = listController;
}
@Provides
@ControllerScope
public XXXListController getMainView() {
return ListController;
}
// other not important
}
基本上每個Controller
應該是單身 - 我不知道想在MainActivity
內部有兩個實例 - 但這不是'必備'。
問題是如何創建Controller
正確的方法。目前,MainActivity
做如下:
router.pushController(RouterTransaction.with(new XXXListController()));
我不知道這一點,爲什麼手動創建Controller
?
裏面onCreateView()
Controller
我注入所有所需的依賴 - 在我看來非常醜陋的方式:
((MainActivity) getActivity()).getMainActivityComponent()
.newXXXListComponent(new XXXListModule(this))
.inject(this);
這個長的問題可以幫助我組織有關匕首我的知識 - 也許有人覺得它有用。但!對於那些達到這一線的Stackoverflowers來說,這是一個好方法,還是有其他更好的方法來做到這一點?
有人想要採取聲音? –