应该将演示者(mvP)注入(dagger2)到android中的视图吗?

Posted

技术标签:

【中文标题】应该将演示者(mvP)注入(dagger2)到android中的视图吗?【英文标题】:should presenters(mvP) be injected(dagger2) to views in android? 【发布时间】:2016-11-15 08:56:38 【问题描述】:

在开发和 android 应用程序的上下文中,我应该直接在视图中使用“新”来使用演示者,还是将它们注入到视图中会更好。

不使用注入演示者的优点/缺点:

    更快的开发时间,无需编写组件和模块。 演示者与视图紧密耦合,我不认为这是一个太大的问题,因为大多数时候演示者不会在多个视图之间共享(即演示者的一个视图)。 可能是测试的问题,因为可以提供演示者的依赖注入模拟实现(不确定这是否有用,需要更多了解)。

【问题讨论】:

【参考方案1】:

你是对的。从长远来看,使用注入只会对您有所帮助。您可以花 5 分钟时间设置您的模块/组件,也可以只是编码。

只要你不做适当的测试,没有太大的区别,如果你的演示者看起来像下面这样

mPresenter = new Presenter();

假设您正确使用构造函数注入,在创建组件后,您可以节省一些行

@Inject Presenter mPresenter;

// onCreate or some other place

    getComponent().inject(this); /* getComponent() also 4-5 lines */

再次。如果您使用正确的构造函数注入,则很有可能您没有很多模块代码。只需创建一些组件即可。

但是您节省了一些时间,并且一旦您想进行测试,这只是一些简单的重构,可以很快完成。

那为什么是匕首?

这是假设您的演示者不依赖于其他对象。但如果是这样呢?

SharedPreferences preferences = getPreferences();
MyStorage storage = new MyStorage(preferences);
mPresenter = new Presenter(storage);

使用某些东西来存储您的数据是一个很好的用例。虽然您只是在 Activity 中添加了更多关于对象创建的逻辑,但 dagger 实现看起来仍然相同。

更多?

现在让我们假设您想在活动之间从上面分享这个storage。现在,您必须在 Application 或其他可以创建 Singleton 以在整个应用程序中使用的地方添加一些逻辑。

不过,这可能不是您唯一的单身人士,而且您的Application 也会开始混乱。不要让我开始管理这些对象的生命周期,例如用户登录或退出,请务必清除缓存数据!

再次。匕首实现看起来仍然相同。如果需要更多逻辑,则可以很好地放置在模块中,并通过组件依赖项进行抽象。


一旦你开始思考我可以创建处理对象构造和注入的类你就知道你一开始就可以使用 dagger ;)

我还写了一篇关于 dagger basics 的博客文章,其中包括构造函数注入的工作原理,许多初学者由于某种原因没有正确使用。

【讨论】:

假设您想在活动之间共享Storage/SharedPreferences 实例,使用 Dagger 提供这些依赖项是完全有意义的。但是作者问的是Presenter——注入它还是直接实例化是否有意义。我个人不会将PresenterStorage 或其他共享对象放在同一个篮子中,因为通常Presenter 与视图紧密耦合。那么,您对这个特殊案例有何看法,您是否将演示者注入您的观点?如果是,您获得了什么好处?

以上是关于应该将演示者(mvP)注入(dagger2)到android中的视图吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何注入动态创建的用例(android,clean architecture,dagger2)

Android单排上王者系列之Dagger2注入原理解析

Dagger2注入原理解析

Android MVP - 应该避免在演示者中使用 R.string 引用吗?

从单元测试的角度来看:视图应该指定演示者还是 GWT MVP 中的其他方式?

android MVP - 我可以有多个演示者用于自定义视图和片段