gpt4 book ai didi

java - 在 Presenter 类中实例化 DI 组件是一种好习惯吗?

转载 作者:行者123 更新时间:2023-11-30 00:35:16 24 4
gpt4 key购买 nike

我最近开始学习 Dagger2。为此,我编写了一个应用程序。

应用架构:

  • ComicListFragment.java 是主要 fragment

  • 这个 fragment 有一个展示器,它将所有逻辑相关的东西保存在一个名为 ComicListFragmentPresenter.java

  • 的展示器类中
  • ComicListFragmentPresenter.java 初始化 Dagger2 DI 组件以注入(inject)所需字段。

  • ComicListFragment.java 调用 ComicListFragmentPresenter.java 公共(public)方法以利用依赖项和调用网络调用等。

问题:

  • 在 Presenter 类中实例化 fragment 的依赖项而不是在 Fragment 中实例化 DI 组件并通过 Presenter 类构造函数注入(inject)依赖项,然后在 Fragment 类中使用 getter 访问这些依赖项是否是一种好的做法?

请提出建设性意见。

代码:https://github.com/wingoku/marvel

最佳答案

Is it a good practice to instantiate a fragment's dependencies in its Presenter class instead of instantiating the DI component in Fragment and injecting the dependencies through Presenter class constructor & later on accessing those dependencies using getters inside the Fragment class?

没有。正如来自 Mark Keen 的评论、 fragment 、 Activity 和服务被选为注入(inject)目标,因为它们由 Android 操作系统实例化,我们无法控制构造函数。您创建的其他类应该更喜欢构造函数注入(inject)以实现可测试性,以便您可以交换测试替身。此外,新的 dagger.android库的设置是为了方便地注入(inject) Fragments 和 Activity,所以如果你明确请求从 Presenter 或任何其他 POJO 中的组件注入(inject),你将失去这种好处。

这是您当前的演示者:

@Inject
ComicsCacheDBController mComicsCacheDBController;

@Inject
Retrofit mRetrofit;

@Inject
Picasso mPicasso;

/**
* Instantiate {@link ComicListFragmentPresenter}
* @param fragment {@link ComicListFragment} instance
*/
public ComicListFragmentPresenter (ComicListFragment fragment)

一个更可测试的演示者将只在构造函数中具有这些依赖项(并且可能依赖于不太通用的依赖项):

@Inject //this is important
public ComicListFragmentPresenter (ComicListFragment fragment, ComicsCacheDBController comicsCacheDBController, Retrofit retrofit, Picasso picasso)

注意构造函数上的@Inject 注释。它请求 Dagger 2 注入(inject)所有这些依赖项。如果您已正确配置它,那么当您在 Fragment 中进行字段注入(inject)时:

@Inject ComicsListPresenter comicsListPresenter;

ComicListPresenter 的整个对象图将同时注入(inject)。

If I have 100 fragments, theoretically I will have 200 additional files just to drive that fragment which can very easily get out of control

Dagger 2 和其他此类依赖注入(inject)框架可帮助您解决特定问题;它们允许您在构造函数中传递可以交换测试替身的依赖项,从而使编写可测试类变得容易。为此,您付出的代价是必须编写轻量级的样板类。他们真的很适合"Uncle Bob"编程风格(许多小文件中的小类,强封装)。如果您不希望有那么多小类,并且希望将更多小类分组到一个文件中(some people 做的),那么您不必使用它。

如果您了解 IDE 快捷方式,您可以非常快速地编写样板文件。编写字段,然后按 Cmd+NAlt+Ins 让 Android Studio 为您生成构造函数。

关于java - 在 Presenter 类中实例化 DI 组件是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43504151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com