【问题标题】:Not able to understand dagger dependency injection concepts - Dagger 2 on android [closed]无法理解 dagger 依赖注入概念 - android 上的 Dagger 2 [关闭]
【发布时间】:2017-07-18 12:36:15
【问题描述】:

我正在尝试了解 dagger2 并在我的应用中实现。我已经阅读了很多关于它的好处。除非并且直到我完全理解它,否则我无法在我的应用中获得它的好处。

我了解@Module 和@Inject。让我感到困惑的是@Component。我有几个与此相关的问题。

  1. Module 提供对象实例,Inject 使用它。为什么我们需要介于两者之间的组件?真的有必要弥补差距吗?我们可以有没有任何方法的空接口组件吗?

  2. 模块类真的需要构造函数吗?如果模块类中没有构造函数,是否可以使用空构造函数初始化模块类?

  3. 为什么我们不能直接实例化模块类并构建依赖图,而不是创建组件然后初始化它?

  4. 目前在组件接口中我只见过两种方法

    一个。无效注入(活动/服务/片段); - 为什么我们需要为此方法提供活动或服务或片段的实例?为什么我们不能有这样的东西 -

    无效注入(); - 组件还会生成依赖图吗?

    我们是否可以从其他类而不是活动或服务或片段中注入类似的东西 -

    无效注入(DataManager dataManager);

    如果 DataManager 是一个单例实例会怎样?

    b.改造 getRetrofit();这种方法和上面的方法有什么区别?为什么这不带任何输入参数?

  5. 我读到@Singleton 只是匕首中的一个作用域。我们如何才能真正创建一个在应用程序的生命周期中存在的单例对象?

  6. 假设有一个我想使用 dagger 构建的 DataManager 实例。它只有一个依赖项。我为此编写了一个模块类和一个组件接口。如果我想在 MainActivity 中使用它,我将它用作

    @Inject DataManager 数据管理器;

    ...

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    DataManagerComponent.Builder().DataManagerModule(new DataManagerModule()).build();

    }

    我想在许多其他活动中使用此数据管理器,但我不想这样做 单身人士。我想将它保留在我使用它的当前活动范围内。所以我 将使用

    @Inject 数据管理器数据管理器;

    获取该实例。我是不是该 写

    DataManagerComponent.Builder...........
    

    在我使用@Inject DataManager dataManager 的每个活动 oncreate() 中?如果非要这样写, 它会不会创建比简单地使用更多的样板代码

    DataManager dataManager = new DataManager();

  7. 假设有 4 个对象,它们相互依赖,例如 D 依赖 C,C 依赖 B 等等。

    D -> C -> B -> A

    假设我已经编写了模块类并为所有 4 个提供了方法。如果 我尝试在任何 ActivityA 中注入 D,例如

    @Inject D d;

    C、B、A 会自动实例化吗?

    假设在 ActivityB 中我只需要注入 B。如果我注入 B 喜欢

    @Inject B b;

    匕首会再次创造B和A吗?还是会使用已经存在的 创建?

如果有人花时间回答我的所有问题,我将不胜感激。我不期待详细的答案。如果它澄清了这个概念,那很好。期待回复。提前致谢。

【问题讨论】:

  • 请查看下面的回复
  • 我讨厌匕首,我宁愿使用 Koin 更好,而不是那么复杂地弄清楚事情的去向。匕首就像是用看不见的线添加蜘蛛网。

标签: android dependency-injection dagger-2 dagger android-mvp


【解决方案1】:

这感觉更像是用勺子喂食。我会尽力为您提供尽可能多的信息。

1 -> Module 提供对象实例,Inject 使用它。为什么我们需要介于两者之间的组件?真的有必要弥补差距吗?我们可以在没有任何方法的情况下拥有空的Interface 组件吗?

优秀代码的基本原则之一是; 固体。这将我们带到了 S.O.L.I.D 中的 I 接口原则的编码。 Dagger 组件是 interfaces,它将为您生成 boilerplate code;它还可以帮助我记录我的对象图。

2 -> 模块类真的需要constructor吗?如果模块类中没有constructor,我们可以使用空的constructor初始化模块类吗? 在模块类中,constructor 主要用于外部依赖项。你可以选择不拥有。这里可以调用你的组件直接说MyComponent.create()

3 -> 为什么我们不能直接实例化模块类并构建依赖图,而不是创建组件然后初始化它? 这就像不使用dagger。在依赖注入出现之前,开发人员仍然可以遵循 SOLID 原则。但是对于 Dagger 之类的框架,它会迫使开发人员在解耦实现时进行思考。

4 a -> *void inject(Activity/Service/Fragment); - 为什么我们需要为此方法提供活动或服务或片段的实例?为什么我们不能有这样的东西 -

void inject(); - Will the component still generate dependency graph?

我们可以从其他类而不是活动或服务或片段中注入类似这样的东西吗?

void inject(DataManager dataManager);

如果DataManagersingleton instance 怎么办?*

您需要在Dagger 中提及目标。不能是interfaceObject可以是singleton没关系。

4 b -> Retrofit getRetrofit(); 这个方法和上面的方法有什么区别?为什么这不带任何输入参数? 这是组件的定义。如果您使用构造函数注入并假设您更改了输入参数的数量,您就不必在每个地方都更改代码。 Dagger 会处理的。 我相信上面的代码是组件定义的一部分,所以当你做组件依赖时,它将帮助你将它暴露给外部图

5 -> 我读到@Singleton 只是dagger 中的一个范围。我们如何才能真正创建一个在应用程序的整个生命周期中都存在的singleton object 如果您给出一个范围并只创建一次该组件,那么拇指规则就在您的模块中,那么它将终生存在。通常在您的 APP 的 Application 类中创建一个具有应用程序范围的组件。

6 -> *假设我想使用 dagger 构建一个 DataManager 实例。它只有一个依赖项。我为此编写了一个模块类和一个组件interface。如果我想在MainActivity 中使用它,我将其用作

@Inject DataManager dataManager;

...

@Override

protected void onCreate(Bundle savedInstanceState) {

DataManagerComponent.Builder().DataManagerModule(new DataManagerModule()).build();

}

我想在许多其他活动中使用这个datamanager,我不希望它是单例的。我想将它保留在我使用它的当前活动范围内。所以我会用

@Inject DataManager dataManager;

获取该实例。我应该写吗

DataManagerComponent.Builder...........

在我使用@Inject DataManager dataManager 的每个活动oncreate() 中?如果我必须写那个,它不会创建比简单使用更多的样板代码吗

DataManager dataManager = new DataManager();* 

在这里你不应该给datamanager提供者任何范围,然后每次你说@inject datamanager它会作为不同的对象实例出现,即使你的组件是singleton范围。

7 -> *假设有 4 个对象,它们相互依赖,例如 D 依赖 C,C 依赖 B 等等。

D -> C -> B -> A

假设我已经编写了模块类并为所有 4 个提供了方法。如果我尝试在任何 ActivityA 中注入 D,例如

@Inject D d;

C、B、A 会自动实例化吗?

假设在ActivityB我只需要注入B。如果我像注入B一样

@Inject B b;

dagger 会再次创建 B 和 A 吗?还是会使用已经创建的?* 如果注入是通过构造函数进行的,或者您必须使用成员注入器,它将被创建。

请查看YouTube tutorials 的扭曲方程以获取dagger2。这有助于我理解Dagger2

如果这对你有帮助,请投票。

【讨论】:

  • 感谢 Jilesh。它帮助很大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多