-5

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

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

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

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

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

  4. 到目前为止,我在组件接口中只看到了两种方法

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

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

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

    无效注入(DataManager 数据管理器);

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

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

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

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

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

    ...

    @覆盖

    protected void onCreate(Bundle savedInstanceState) {

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

    }

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

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

    得到那个实例。我应该写吗

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

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

    数据管理器数据管理器 = 新数据管理器();

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

    D -> C -> B -> A

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

    @Inject D d;

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

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

    @注入 B b;

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

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

4

1 回答 1

6

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

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

好的代码的基本原则之一是;固体。这使我们对SOL I .D 中的I接口原理进行编码。组件是它会为您生成的;它还可以帮助我记录我的对象图。Daggerinterfacesboilerplate 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。不可能interfaceObjectsingleton不能无所谓。

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

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

6 -> *假设有一个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会作为不同的对象实例出现,即使你的组件是singleton范围。

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

D -> C -> B -> A

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

@Inject D d;

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

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

@Inject B b;

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

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

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

于 2017-07-18T13:31:40.723 回答