除了测试,为什么我们需要Dagger 2?

Hen*_*ian 13 java android dependency-injection dagger-2

此时,我对依赖注入(DI)的理解仅来自本文.我有兴趣尝试,但我只需澄清一些事情:

  1. 许多人将DI称为减少样板代码的工具.但根据该教程,Dagger 2的设置往往会为配置(模块和组件)创建更多类.我没有尝试过,但从它的外观来看,它并没有减少代码,它只是拆分它们,所以主类看起来更整洁.我错了吗?
  2. 尽管Dagger 2声称 DI不仅仅用于测试,但很多人都将其主要用于测试,包括Android自己的指南.你有没有在生产就绪的应用程序中使用Dagger 2?它有多大用处?
  3. 如果我完全习惯通过构造函数等创建传统依赖项,我是否还需要查看Dagger 2?我觉得这个库可能有能力改变我对RxJava的编码方式,我只是不确定它的好处和RxJava给我的一样多.

我知道,将Dagger与RxJava进行比较就像将苹果与橙子相比较.但从某种意义上说,它们都像Dagger一样是水果,而RxJava是可能使我的项目更大的第三方库.

Jef*_*ica 10

你已经将两个单独的问题结合起来,这些问题应该单独评估:"为什么我们需要依赖注入?" 和"为什么我们需要匕首2?"

依赖注入(控制反转)很有用,因为它允许组件的使用者提供组件的依赖关系.以日志格式化程序为例:如果没有依赖注入,您可能需要编写登录到的类的三个不同版本stdout,远程服务器或文本文件.相比之下,如果您要编写一个LogFormatter接受Writer它写入的内容,那么您可以编写一次并传入Writer最合适的内容,包括测试double(您制作的FakeWriter,StringWriter或模拟框架)用于测试的创建的mockWriter实例.虽然它是为Guice而不是Dagger编写的,但我写了一个单独的SO答案,讨论了依赖注入在生产使用和测试用例中的价值; 您看到的大部分教程都将重点关注测试,假设"生产"和"测试"是您事先了解的两种情况,其他重用和再利用的机会将在以后出现.

一旦您接受了依赖注入为您提供的模块化,可重用性和可测试性优势,您可能会留下一个问题:如何管理这些极长的构造函数?毕竟,为了继续这个LogFormatter例子,你将无法在不关心日志的情况下编写你的应用程序.

MyApplication application = new MyApplication(
    new LoggingService(new LogFormatter(new StdOutWriter())),
    new DatabaseService(new MyApplicationDatabase(new File("my.db"))),
    ...);
Run Code Online (Sandbox Code Playgroud)

这就是Dagger的亮点:它让您拥有依赖注入的所有好处,同时自动为您管理构造函数.这使得它可以封装创建对象的责任并使其更清晰,更安全,RxJava可以封装管理和传播异步事件的责任,使其更清洁,更安全.

重要的是要意识到Dagger 2的样板减少与手动依赖注入相比,而不是你要比较的原始构造函数调用.如果你坚持new直接调用,你可能会完全避免使用这个对象构建样板,但是你也会发现自己正在经历困难的杂技,试图将工作分解给多个开发人员,或者试图测试或重用你的代码.写了.集体的痛苦是为什么依赖注入如此受欢迎的概念,以及为什么像Spring,Guice和Dagger这样的图书馆越来越受欢迎.

我可以保证在几个特别大,众所周知且使用良好的生产Android应用程序中使用Dagger 2.:)