【问题标题】:Multi-layer / libraries architecture with dagger2: designing scopes, components, modules使用 dagger2 的多层/库架构:设计范围、组件、模块
【发布时间】:2017-10-02 16:06:36
【问题描述】:

我在 多层多库 Android SDK 项目中使用 dagger 2

我正在不同层(数据、业务逻辑、表示等)上开发许多不同的库,并使用 dagger 将它们粘合在一起。

我最重要的要求是架构的每个库都应该可以独立使用(及其依赖的组件),并且开发人员应该决定在他想要的任何层上构建:

例如:

  • 使用以下所有内容重写所有表示层
  • 随意替换堆栈的任何部分以增强或更改行为

现在我已经为每个库创建了一个具有自定义范围的 Dagger 组件,但有时我有一个依赖于 2-3 个其他组件的组件,并且 Dagger 抱怨只有 1 个依赖项组件应该是作用域的。 (Es. 域层使用服务组件从公司服务获取数据,使用传感器组件获取设备传感器数据/连接性或其他)。

我无法摆脱作用域,因为我需要对这些组件进行作用域/单例。

我目前的解决方法是将依赖组件传递给模块构造函数,但这看起来像是一种解决方法,我想知道用 Dagger 2 处理这种需求的正确方法是什么。

复杂性也不能很好地扩展,并且替换中间的一块需要扩展替换实现的模块之一,这对用户来说根本不友好。

我已经阅读了有关子组件的信息,但看起来除非您为每个子组件编写一个组件,否则它们不能单独使用,它们还为实际实现声明模块,因此它们不能被其他一些实现替换。

有人可以用 dagger 分享他们的架构详细阐述这些概念,重点关注一个库项目,以供其他开发人员用来组装零件和重用组件吗?

(这个问题has been asked 最初在 dagger2 问题跟踪器上,但已关闭,指向我堆栈溢出 - 仅使用模块也不合适,因为这些要求库的用户知道要组装哪个模块和我如何以及我无法设置不强制执行特定实现的模块依赖项)

【问题讨论】:

    标签: android architecture android-library dagger-2


    【解决方案1】:

    很抱歉,但我认为这个想法行不通,因为要求有点矛盾。

    即:

    我不能只提供模块而不提供组件(如 Dagger 2 问题跟踪器上的线程中所建议的那样)

    我最重要的要求是架构的每个库都应该可以独立使用(及其依赖的组件),并且开发人员应该决定在他(或她)想要的任何层上构建

    将很难一起设计。 Dagger 2 在编译时使用静态代码生成。组件需要知道它们的子组件,或者依赖组件需要知道它们的父组件。要拥有一个交钥匙 Dagger 2 解决方案,其中所有消费者所做的只是从组件调用注入,您将需要至少部分设置对象图。这将使您难以实现所需的模块化。

    因此,我认为关于问题跟踪线程的建议(仅提供模块并让消费者设置组件)是正确的解决方案。您可以使用自己的范围注解和/或 JSR-330 @Singleton 等注解来提示您的库的使用者应该如何设置他们的对象图。

    最后,Amir Ziarati 最近发布了一个使用 Dagger 2 的具有多个模块的 Android 项目示例。希望对您有所帮助,链接是 here

    【讨论】:

      猜你喜欢
      • 2016-05-20
      • 2016-04-08
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多