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

时间:2016-07-12 23:25:02

标签: android mvp dagger-2 presenter

在开发和Android应用程序的上下文中,我是否应该使用' new'直接在视图中使用演示者?或者如果我将它们注入视图会更好。

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

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

1 个答案:

答案 0 :(得分:6)

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

只要您没有进行适当的测试,如果您的演示者看起来如下,则没有太大区别

mPresenter = new Presenter();

假设您正确使用构造函数注入,在创建组件后,与

相比,可以保存一些行
@Inject Presenter mPresenter;

// onCreate or some other place
{
    getComponent().inject(this); /* getComponent() also 4-5 lines */
}

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

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

那么为什么Dagger?

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

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

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

更多?

现在让我们假设你想在活动之间分享这个storage。现在,您必须为Application或其他可以在整个应用中创建单身人士的地方添加一些逻辑。

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

再次。匕首的实现看起来仍然相同。如果需要更多的逻辑,它可以放在模块中,并使用组件依赖项进行抽象。

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

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