![]() |
1
16
Dagger在编译时生成代码,所以您不会像在Guice中那样具有模块灵活性;而不是Guice能够反射地发现
也就是说,您似乎可以使用包含所有可能实现的单个APK,所以唯一的问题是在运行时在它们之间进行选择。这在Dagger中非常可能,并且可能会分为四种解决方案之一:David的基于组件依赖关系的解决方案、模块子类、有状态模块实例或
组件依赖关系
如中所示
David's blog you linked
,可以使用需要传入的一组绑定定义一个接口,然后通过传入生成器的该接口的实现提供这些绑定。虽然界面的结构使得这个精心设计的
然而,我不确定这个解决方案是否适合您:这种结构也最适合继承独立的实现,而不是在您的情况下
模块子类
匕首允许非-
这是可行的,因为您可以提供单个模块实例并将其视为
abstract factory pattern
,但通过调用
模块实例提供可能的虚拟模块的能力实际上意味着 使用构造函数参数传递模块实例 ,然后您可以使用它在实现之间进行选择。
同样,这并没有充分发挥匕首的潜力;您可以通过手动委托给所需的正确提供者来实现这一点。
较好的现在,除非需要,否则不需要创建任何实例,Nfc60Manager和NfcDefaultManager可以接受Dagger提供的任意参数。这导致了第四种解决方案: 注入配置
通过这种方式,您可以将您的业务逻辑封装在您自己的配置对象中,让Dagger提供您所需的方法,并使用静态
关于GUI模块#配置(活页夹)的旁注
打电话是不习惯的
|
![]() |
2
4
我不确定这是你想要的答案,但万一你有其他选择,对于其他社区成员,我将描述完全不同的方法。 我想说,到目前为止,您使用Guice的方式是对DI框架的滥用,您最好利用这个机会来消除这种滥用,而不是在Dagger中实现它。 让我解释一下。 依赖注入架构模式的主要目标是将构造逻辑与功能逻辑分离。 您基本上想要实现的是标准多态性——基于一组参数提供不同的实现。 如果您为此使用模块和组件,那么最终将根据管理这些多态实现需求的业务规则来构建DI代码。 这种方法不仅需要更多的样板文件,而且还可以防止出现具有有意义结构的内聚模块,并提供对应用程序设计和体系结构的见解。 此外,我怀疑您是否能够在依赖注入逻辑中对这些“编码”的业务规则进行单元测试。 有两种方法比IMHO好得多。 第一种方法仍然不是很干净,但至少它不会影响依赖注入代码的大规模结构:
在实现之间进行选择的逻辑仍然驻留在DI代码中,但至少它没有进入该部分的大规模结构中。 但在这种情况下,最好的解决方案是进行适当的面向对象设计,而不是滥用DI框架。 我很确定所有这些类的源代码都非常相似。它们甚至可能在只重写一个方法的情况下从另一个方法继承。 在这种情况下,正确的方法不是复制/继承,而是使用策略设计模式进行组合。 您可以将“策略”部分提取到一个独立的类层次结构中,并定义一个工厂类,该工厂类根据系统参数来构造它们。然后,你可以这样做:
现在构造逻辑简单明了。内部封装的策略之间的差异
这种恰当方法的最佳部分是,当需要实施新策略时(因为我们都知道Android碎片化是不可预测的),您不需要实施新的模块和组件,也不需要对DI结构进行任何更改。这个新的需求将通过提供策略的另一个实现并向工厂添加实例化逻辑来处理。 所有这些,同时通过单元测试保持安全。 |
![]() |
Abhilash Das · 输入文本时,编辑文本与工具栏重叠 1 年前 |
![]() |
Community wiki · 局部变量可能尚未初始化 1 年前 |
![]() |
jvargas · 如何获取上个月的第一天和最后一天以及一年的第一天 2 年前 |