我应该注入每个 class 或特定的 class 吗?

Should I inject every and any class or specific classes?

我刚开始接触 DI(依赖注入)框架,我想知道我是否应该注入每个 class 或特定的 classes?我怎么知道你应该注入哪些 classes 而你不应该注入哪些?

我发现的很多教程(Dagger 2、Hilt 等)似乎都没有谈论这个或没有很好地解释它。

我没有任何代码示例,因为我在阅读教程时正在尝试一些东西。只是想感受一下。

像我 4 岁一样解释它:)

我的回答是否定的,您不必在每次需要创建对象时都使用依赖注入。

根据Wikipedia

,这是依赖注入的目的

依赖注入背后的意图是实现对象构造和使用关注点的分离。这可以提高可读性和代码重用。

所以你应该使用依赖注入,它会提高你的代码重用性和可读性。

This文章提到了一些你应该使用依赖注入来创建对象的情况

  1. 您需要将配置数据注入一个或多个组件。
  2. 您需要在多个组件中注入相同的依赖。
  3. 您需要注入相同依赖项的不同实现。
  4. 您需要在不同的配置中注入相同的实现。
  5. 您需要容器提供的一些服务。

假设您在应用程序中有用户名和密码字段,您将使用这些字段来捕获用户的详细信息,您不必使用依赖注入从详细信息创建用户对象,您可以直接创建它,它不是可以在您的应用程序中重复使用的东西,您应该研究其他对象创建模式,例如工厂模式、抽象工厂模式、构建器模式 e.t.c.

有一定数量的 classes 我总是注入并且从不问自己这个问题:应用程序上下文、共享首选项、DAO、Retrofit、Json 对象。如您所见,这些通常与第三方库或Android框架有关。

然后有 classes 依赖于那些:存储库是一个常见的例子,但还有更多。例如,您可以有一个偏好管理器,它依赖于共享的偏好和上下文。或者你可以使用 class JsonExporter 来导出依赖于 DAO 和 Json 映射器的用户数据。

反过来,还有其他 classes 依赖于那些新的 classes:MVVM/MVP 架构中的视图 model/presenter 可能同时依赖于存储库和JsonExporter 例如。此时你有两个选择:

  1. 自己实例化class。但这意味着您需要访问所有 class' 依赖项,这些依赖项只能通过依赖项注入获得...
  2. 所以你不妨注入它。此时注入的代价往往很低,只需在构造函数中加入@Inject即可。只需在模块中提供基本依赖项。

从一定数量的注入基础 classes 中,注入更多嵌套在依赖关系图中的决定真正自动产生。

在某些情况下,您的 class 不依赖于任何东西。也许您决定将代码从一个大 class 提取到另一个。或者 class 可能只是没有依赖关系。我可能不会注入这样的class,没有意义。

单例通常很容易注入,因为依赖注入框架(例如 Dagger)可以确保自动始终只有一个实例。

我们进行依赖注入的一个原因是 classes 依赖于抽象,而不是具体化(又名控制反转)。让你的 class 依赖于 Repository 接口是很有用的,因为你可以决定为它提供你想要的实现,例如应用程序中的 RealRepository,以及 MockRepository在测试中。另一个例子是风格或构建变体:注入的 FlavorBehavior 接口可以在两种不同的风格中有不同的实现。决定使用哪个不是 class' 的责任。

请注意,这不是确定的答案,我也不是这方面的专家。这也是一个基于意见的主题。

当前的所有答案都非常有见地,但过于复杂。我想要一个简单的答案。

经过大量研究,我决定注入所有单例和其他任何东西,在没有任何注入的情况下定义它们。与 建议的非常相似