使用dagger2的多层/库架构:设计范围,组件,模块

时间:2017-05-04 12:57:07

标签: android architecture android-library dagger-2

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

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

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

例如:

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

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

我无法摆脱范围,因为我需要将这些组件作为范围/单例。

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

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

我已经阅读过有关子组件的内容,但看起来除非您为每个组件编写组件,否则它们不能单独使用,它们也会为实际实现声明模块,因此它们不能仅仅替换为其他实现。

某人可以用匕首分享他们的架构详细阐述这些概念,其中一个库项目的重点是由其他开发人员用来组装部件和重用组件吗? / p>

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

1 个答案:

答案 0 :(得分:0)

对不起,我不认为这个想法会有效,因为要求有点矛盾。

即:

  

我不能提供模块而不提供组件(如Dagger 2问题跟踪器中的线程所推荐)

  

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

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

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

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