【发布时间】:2020-12-31 08:54:39
【问题描述】:
如果我的班级只有由容器注入的私有字段怎么办?是好还是坏?在这种情况下,我必须在测试中使用 DI 框架(也许这还不错),但另一方面,没有设置器,没有不必要的代码。这是不好的做法吗?
【问题讨论】:
-
通常我会使用构造函数而不是让容器直接设置字段...使用构造函数可以很容易地测试,并允许字段是最终的,而不会受到编译器的影响。
如果我的班级只有由容器注入的私有字段怎么办?是好还是坏?在这种情况下,我必须在测试中使用 DI 框架(也许这还不错),但另一方面,没有设置器,没有不必要的代码。这是不好的做法吗?
【问题讨论】:
Setter 方法是实现抽象的方式,这是 OOP 最重要的原则之一。理想情况下,代码不应依赖于容器。我认为 setter 方法将提供使用 DI 的标准方法以及良好的代码可读性。我一直认为 setter DI 是一种很好的做法,除非我的类实例化依赖于其他一些依赖项(为此我将使用基于构造函数的 DI)。
我认为你不应该依赖容器来执行 DI。
希望这会有所帮助。
【讨论】:
strong text**首先,通过setter方法替代DI的方法是什么? Martin Fowler 区分three ways:**接口、setter 和构造函数注入。因此,根据定义,这些方式都没有好坏之分,这取决于您如何使用它们以及最适合您的系统的方式。如果您希望您的字段在对象创建后不可变,请使用带有私有字段的构造函数注入。 尽管如此,Setter 注入是最常见的 DI 方式,并且有几个框架依赖它。如果你不确定就用这种方式。您还会发现很多关于它的信息。
如果您的问题完全针对 setter 的使用,那么问题是您的类是否是数据结构(有关详细信息,请参阅 Martin 的 Clean Code 第 6 章)。换句话说,如果您的课程除了保存一些数据之外没有其他目的,您可以将您的字段公开(*)。如果它包含业务逻辑,请使用私有字段和 getter/setter。
(*) 我个人不同意这一点,但这只是我自己。 :-)
【讨论】: