Java 除了测试,为什么我们需要匕首2?
此时,我对依赖注入(DI)的理解仅限于。我有兴趣尝试,但我只需要澄清一些事情:Java 除了测试,为什么我们需要匕首2?,java,android,dependency-injection,dagger-2,Java,Android,Dependency Injection,Dagger 2,此时,我对依赖注入(DI)的理解仅限于。我有兴趣尝试,但我只需要澄清一些事情: 许多人将DI称为减少样板代码的工具。但根据该教程,Dagger2的设置倾向于创建更多的配置类(模块和组件)。我还没有尝试过,但是从外观上看,它并没有减少代码,它只是将它们分割开来,以便使主类看起来更整洁。这一点我错了吗 尽管DI不只是用于测试,但许多人认为它主要用于测试,包括。您是否在生产就绪应用程序中使用了匕首2?它对你有多有用 如果我对通过构造函数之类的方式创建传统依赖关系非常满意,那么我还需要看看Dagger
我知道,将Dagger与RxJava相比较就像将苹果与橙色相比较。但从某种意义上说,它们都是一个成果,就像Dagger和RxJava是第三方库一样,可能会使我的项目更大 我只使用了匕首1,但这可能在某些方面对您有所帮助: Dagger为不同的目标应用程序建立了一个(D)方向(a)循环(g)图(这也是我名字的来源) 因此,在一个应用程序项目中,我们能够构建四个不同的应用程序,与杰克·沃顿的应用程序非常相似。所有这些应用都有不同的目标。一个是内部测试,一个是测试团队(带有屏幕截图功能),一个是内部发布,另一个是发布 那么为什么我们需要四种不同的应用程序呢?答案是:这样我们就不必在发布应用程序中有调试或测试代码,我们可以分离不属于一起的代码
if(currentMode == Mode.DEBUG){
Timber.i(...);
}
这样的事情已经没有必要了
前面提到的屏幕截图功能不属于生产代码,因此它只存在于测试代码中。在构建应用程序时,框架使用了正确的模块并将其注入
注意:我确信dagger还有其他的用例
编辑:这不会改变您以RxJava的方式编写代码的方式,但您必须在模块中大量使用DI。您已经组合了两个单独的问题,应该分别进行评估:“为什么我们需要依赖项注入?”和“为什么我们需要匕首2?” 依赖项注入(控制反转)非常有用,因为它允许组件的使用者提供组件的依赖项。以日志格式化程序为例:如果没有依赖项注入,您可能需要编写三个不同版本的类,将它们记录到
stdout
、远程服务器或文本文件中。相比之下,如果您要编写一个LogFormatter
来接受它所写入的Writer
,那么您可以将它写入一次并传入最合适的Writer
,包括一个用于测试的双重测试(您制作的假编写器、StringWriter或由mockWriter实例创建的模拟框架)。虽然它是为Guice而不是Dagger编写的,但我写了一篇关于依赖注入在生产使用中的价值以及测试用例的文章;您看到的大多数教程都将集中在测试上,前提是“生产”和“测试”是您预先知道的两种情况,其他重用和重新调整用途的机会将在稍后出现
一旦您接受依赖注入提供的模块化、可重用性和可测试性优势,您可能会面临一个问题:如何管理这些非常长的构造函数?毕竟,要继续使用LogFormatter
示例,如果不考虑日志的去向,就无法编写应用程序
MyApplication application = new MyApplication(
new LoggingService(new LogFormatter(new StdOutWriter())),
new DatabaseService(new MyApplicationDatabase(new File("my.db"))),
...);
这就是Dagger的闪光点:它让您在自动管理构造函数的同时拥有依赖注入的所有好处。这使得它能够封装创建对象的职责,使其更干净、更安全,就像RxJava封装管理和传播异步事件的职责,使其更干净、更安全一样
重要的是要认识到,Dagger 2在样板文件中的缩减是与手动依赖项注入相比的,而不是与之相比的原始构造函数调用。如果您坚持直接调用new
,可能会完全避免使用此对象构造样板文件,但您也会发现自己正在经历困难的杂技,试图将工作分配给多个开发人员,或者尝试测试或重用您编写的代码。共同的痛苦是为什么依赖注入这个概念如此流行,以及为什么像Spring、Guice和Dagger这样的库越来越流行
我可以担保Dagger 2在几个特别大、知名且使用广泛的Android生产应用程序中的使用: 若你们只读了一篇关于DI的文章,你们可能会感兴趣,看看Dagger是否在“生产就绪应用”中使用。虽然此统计数据可能包括类似的Dagger 1,但您可以看到它在>2%的应用程序和>12%的安装中使用,但在测试方面,我们可以不使用它,只使用mockito模拟MVP演示者依赖关系,对吗?我确实看到了控制反转的作用。我说的对吗?@j2emanue是的,您可以在控制反转时停止,并使用Mockito进行单元测试。然而,您将需要管理构造函数调用的深层树,这在生产和测试构建之间可能会有所不同,并且您的开发构建也可能会有所不同。您可能会选择这样做,这取决于您必须管理的构建和类的数量,但当您达到一定的规模/复杂性时,您可能会选择这样做