2017-05-04 42 views
0

我使用匕首2多层多库 Android SDK中的项目。多层/库架构dagger2:设计范围,组件,模块

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

我最重要的要求是,该建筑的每个库应该使用独立的(带及其相关组件),以及一个开发者应该决定的基础上,他想要的任何层之上:

例如:

  • 使用一切下面
  • 随意替换任何片堆叠的,以增强或改变行为
重写所有表示层

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

我不能摆脱范围,因为我需要这些组件是范围/单身。

我目前的解决方法是通过依赖组件的模块构造,但是这看起来像一个解决办法,我想知道什么是接近这种要求用匕首2

复杂性的正确方法也不能很好地扩展,并且替换中间的一部分需要扩展替换实现的模块之一,这根本不是用户友好的。

我读过关于子组件,但看起来像那些不能独立使用,除非你为每个组件编写组件,他们还为实际实现声明模块,以便它们不能被其他实现替换。

有人可以分享他们的匕首架构细说这些概念与库项目的重点,被其他开发者用于组装部件和组件的重用?

(这个问题has been asked最初的dagger2问题跟踪,但被关闭指着我堆栈溢出 - 只使用模块也是不适合的原因,这些需要的库的用户知道组装的模块,以及如何和我没有办法设置不强制执行特定实现的模块依赖关系)

回答

0

对不起,但我不认为这个想法会起作用,因为需求有点矛盾。

即:

我不能提供的模块,而不是组件(如在匕首2问题跟踪线程推荐)

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

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

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

最后,Amir Ziarati最近发布使用匕首2.我希望它能帮助多个模块的Android项目的例子,该链接是here