无法理解匕首依赖注入概念 - 在Android

时间:2017-07-18 12:36:15

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

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

我已经理解了@Module和@Inject。令我困惑的是@Component。我几乎没有相关的问题。

  1. 模块提供对象实例,Inject使用它。为什么我们之间需要组件?是否真的有必要缩小差距?我们可以在没有任何方法的情况下使用空接口组件吗?

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

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

  4. 到目前为止,我在组件界面中只看到过两种方法

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

    void inject(); - 组件是否仍会生成依赖图?

    我们可以从活动或服务以外的其他类注入或者像这样的片段 -

    void inject(DataManager dataManager);

    如果DataManager是单例实例怎么办?

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

  5. 我读到@Singleton只是匕首的范围。我们怎样才能真正创建一个在应用程序的生命周期内存在的单例对象?

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

    @Inject DataManager dataManager;

    ...

    @覆盖

    protected void onCreate(Bundle savedInstanceState){

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

    }

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

    @Inject DataManager dataManager;

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

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

    在每个活动oncreate()中我使用@Inject DataManager dataManager?如果我要写那个, 它不会创建更多的样板代码而不仅仅是使用

    DataManager dataManager = new DataManager();

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

    D - > C - > B - >甲

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

    @Inject D d;

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

    让我们假设在ActivityB中我只需要注射B.如果我注射B 喜欢

    @Inject B b;

    匕首会再创造B和A吗?或者它会使用已经存在的那些 创建?

  8. 如果有人花时间回答我的所有问题,我感激不尽。我不希望得到详细的答案。如果澄清这个概念就好了。期待着回应。提前致谢。

1 个答案:

答案 0 :(得分:6)

这更像是勺子喂食。我会尽力给你尽可能多的信息。

1 - > 模块提供对象实例,Inject使用它。为什么我们之间需要组件?是否真的有必要缩小差距?我们可以在没有任何方法的情况下使用空的Interface组件吗?

良好代码的基本原则之一是;的 SOLID 即可。这使我们在S.O.L. I .D中对 I 的接口原理进行编码。 Dagger组件是为您生成interfaces的{​​{1}};它也可以帮助我记录我的对象图。

2 - > 模块类真的需要boilerplate code吗?如果模块类中没有constructor,我们可以使用空constructor初始化模块类吗? 在模块类中,constructor主要用于外部依赖关系。你可以选择不拥有一个。在这里,您可以调用您的组件并直接说constructor

3 - > 为什么我们不能直接实例化模块类并构建依赖图而不是创建组件然后初始化它? 这就像不使用MyComponent.create()一样。在依赖注入开始之前,开发人员仍然可以遵循SOLID原则。然而,dagger类似框架它迫使开发人员考虑解耦实现。

4 a - > * Dagger - 为什么我们需要为此方法提供活动或服务或片段的实例?为什么我们不能有这样的东西 -

void inject(Activity/Service/Fragment);

我们可以从活动或服务以外的其他类注入或者像这样的片段 -

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

如果void inject(DataManager dataManager); DataManager?*

,该怎么办?

您需要在singleton instance中提及目标。它不能是Daggerinterface可以是Object无关紧要。

4 b - > singleton此方法与上述方法有什么区别?为什么不采用任何输入参数? 这是组件的定义。如果您使用构造函数注入,并且如果您更改输入参数的数量,则表示您不必每次都更改代码。 Retrofit getRetrofit();会照顾它。 上面的代码我认为是组件定义的一部分所以当你做组件依赖时它会帮助你将它暴露给外层图

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

6 - > *我们假设有一个singleton object实例,我想用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........... 的每个活动oncreate()中?如果我必须写它,它不会创建更多的样板代码而不是简单地使用

@Inject DataManager dataManager

此处您不应向DataManager dataManager = new DataManager();* 提供商提供任何范围,然后每当您说datamanager时,即使您的组件为@inject datamanager范围,它也会作为不同的对象实例。

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

singleton

让我们假设我已经编写了模块类并为所有人提供了方法4.如果我尝试在任何D -> C -> B -> A 中注入D

ActivityA

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

让我们假设在@Inject D d; 我只需要注入B.如果我注入B就像

ActivityB

@Inject B b; 会再次创建B和A吗?或者它会使用已经创建的那些?* 如果注入是通过构造函数创建的,那么它将被创建,否则你将使用成员注入器。

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

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