【问题标题】:Dagger 2 - What is better, inject constructor or provide method?Dagger 2 - 注入构造函数或提供方法哪个更好?
【发布时间】:2019-02-02 08:52:29
【问题描述】:
我一直在使用 Android 学习 Dagger 2。我阅读的大多数帖子都写道,最好使用构造函数注入而不是字段和方法注入。
我很困惑,想明确一下,什么时候应该使用构造函数注入,什么时候使用字段和方法注入?
【问题讨论】:
标签:
android
dependency-injection
dagger-2
【解决方案1】:
构造函数注入更具可读性,您可以轻松区分
与其余部分的依赖注入相关的类的一部分。
其次,所有的值都是从类存在的一开始就初始化的,因此您可以在初始化块中使用它们。
测试更清晰,您确切知道应该为被测类提供哪些依赖项,否则您的代码将无法编译。使用现场注入,您需要手动设置所有内容。
但这并不意味着没有字段或方法注入的用例。字段注入在您无法控制 Activity 等实例化的 android 类中特别有用。
我也倾向于在使用构造函数注入的子类中也使用字段注入,并且我不想用公共对象污染构造函数。例如。我有 BaseViewModel ,我在其中注入 ExceptionHandler 在字段上,这样我就不需要将该 ExceptionHandler 放在每个子类构造函数中,然后向上传递到基础。
【解决方案2】:
我认为经验法则是仅对由系统而不是开发人员实例化的框架类使用字段注入:ActivityFragment 等等(因为你不能说实例化 Activityyourself) .
对其他一切都使用构造函数注入,构造函数注入是首选的好处之一是它更容易用于单元测试 - 您仍然可以使用该构造函数“手动”实例化您的类。
至少对我来说,构造函数注入感觉更“自然”/更面向对象 - 依赖项在构造函数中传递,并由类来处理它们想要的方式,字段注入就像从外面来的人一样“推搡” " 注入类中的这些依赖项