【发布时间】:2017-03-16 21:52:54
【问题描述】:
我有一个应用程序,假设有 15 个屏幕。 有 3 个主要的、完全独立的活动:
-
LoginActivity- 很明显的一个,一些登录的东西 -
MainActivity- 最重要的,最重要的 TheOtherOneNotRelevantAtTheMoment
我决定使用Conductor,因为我发现Fragment 的生命周期太复杂了,而Conductor 对我来说现在是“热狗”
我有很多指挥家的控制器。他们中的大多数都像XXXListController 和相应的XXXDetailController。所有这些控制器仅存在于MainActivity 内。这有点像“单一活动应用程序”。 LoginActivity 的引入主要是由于来自第三方 OAuth 的回调,例如 FbLogin 和 Google Login。我只是想让MainActivity 完全属于我——没有任何其他奇怪的行为。
为了稍微整理一下依赖关系,我决定使用 Dagger2。我在 Spring 和 JavaEE 方面有很好的经验,所以我认为这很容易。
我认出了几个没有任何问题的模块:
AppModule - 与我的应用程序相关的东西,如服务器地址等
AndroidModule - 像 SharedPreferences, Application
然后我几乎“即兴发挥”了如何组织我的观点。这就是我所拥有的:
- 另外 3 个作用域:
ActivityScope、ControllerScope和ServiceScope- 不相关。 - 每个
Controller都有自己对应的Module和Component。我读到这可能不是一个好主意,但我可以接受 - 每个Controller都非常独立,并且有自己独特的一组依赖项。 -
ApplicationComponent当然是层次结构的根。 -
MainActivityComponent是@Subcomponent的ApplicationComponent -
XXXControllerComponent是@Subcomponent的MainActivityComponent
要在MainActivity 中注入依赖项,我正在使用,我发现这段代码很常见:
protected void injectDependencies(ApplicationComponent component) {
component.plus(new MainActivityModule(this)).inject(this);
}
当我想为我的Controllers 创建和注入依赖项时出现问题。
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);
这个长问题帮助我整理了关于 Dagger 的知识——也许有人觉得它有帮助。但!对于那些到达这条线的Stackoverflowers,这是一个好方法还是有其他更好的方法来做到这一点?
【问题讨论】:
-
有人想发声吗?
标签: android dependency-injection dagger-2 conductor