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

cod*_*tor 3 mvp android presenter dagger-2

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

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

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

Dav*_*jak 6

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

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

mPresenter = new Presenter();
Run Code Online (Sandbox Code Playgroud)

假设您正确使用构造函数注入,在创建组件后,与之相比,您可以保存一些行

@Inject Presenter mPresenter;

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

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

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

那么为什么Dagger?

这假设您的演示者没有依赖其他对象.但如果它呢?

SharedPreferences preferences = getPreferences();
MyStorage storage = new MyStorage(preferences);
mPresenter = new Presenter(storage);
Run Code Online (Sandbox Code Playgroud)

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

更?

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

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

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


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

我还写了一篇关于匕首基础知识的博客文章,包括构造函数注入是如何工作的,许多初学者因某种原因没有正确使用它.

  • 假设您想在活动之间共享“ Storage / SharedPreferences”实例,那么使用Dagger提供这些依赖关系是完全有意义的。但是作者在询问“ Presenter”-注入还是直接实例化是否有意义。我个人不会将“ Presenter”与“ Storage”或其他共享对象放在同一篮子中,因为通常“ Presenter”与视图紧密相关。那么,您对此特殊情况有何看法,您是否将主持人注入自己的观点?如果是,您将获得什么好处? (2认同)