实体内部的 fromXYZ 方法是反模式吗?
Are fromXYZ methods inside entities an antipattern?
我正在开发一个 Symfony 应用程序,但我想我的问题主要与
框架使用。
情况是这样的:
我得到了一个非常轻量级的实体,它实际上什至不受 ORM 管理,因为它只是用于聚合和交流另一个实体的信息。
我读到我们应该将业务逻辑排除在模型之外,但我也认为它会
如果我在我的轻量级实体中有一个 fromXYZ
方法来创建基于“大实体”的实例化的 SPOC,那么证明对我非常有用。
但从技术上讲,这种 from-method 执行的逻辑与我读到的良好做法相矛盾。
那么这会是反模式吗?如果是,我将如何以更合适的方式解决这个问题?
你说的是 static factory method。使用它非常好,但它不应该做任何花哨的事情,因为你不能模拟它,因此很难测试你的代码。
如果您觉得您的方法在测试中不会产生任何问题,您可以毫无疑问地创建它。否则,您可以将您的创建逻辑封装在一个单独的工厂中。
您的“轻量级实体”可以称为 DTO。
保持术语直截了当的一种方法。
- 实体由 ORM 管理。
- DTO 不受管理。通常用于传达实体的子集或集合。
通过复制一个对象的字段从另一个对象构造一个对象不是我认为的业务逻辑,除非业务需求规定了复杂的转换。
fromXYZ
方法的真正问题是它们实现了对 XYZ
的依赖。您必须注意此类依赖项指向的方向。例如,如果您通过将实体传递给 DTO 来构建 DTO,则该 DTO 现在对应用程序的持久层具有依赖性。如果您随后在服务中使用该 DTO,您的服务层现在对您的持久层具有(传递)依赖性。这被称为紧耦合。
保持业务逻辑与持久性、视图等分离的一种方法是将依赖指向另一个方向:进入服务而不是离开服务。
我正在开发一个 Symfony 应用程序,但我想我的问题主要与 框架使用。
情况是这样的:
我得到了一个非常轻量级的实体,它实际上什至不受 ORM 管理,因为它只是用于聚合和交流另一个实体的信息。
我读到我们应该将业务逻辑排除在模型之外,但我也认为它会
如果我在我的轻量级实体中有一个 fromXYZ
方法来创建基于“大实体”的实例化的 SPOC,那么证明对我非常有用。
但从技术上讲,这种 from-method 执行的逻辑与我读到的良好做法相矛盾。
那么这会是反模式吗?如果是,我将如何以更合适的方式解决这个问题?
你说的是 static factory method。使用它非常好,但它不应该做任何花哨的事情,因为你不能模拟它,因此很难测试你的代码。
如果您觉得您的方法在测试中不会产生任何问题,您可以毫无疑问地创建它。否则,您可以将您的创建逻辑封装在一个单独的工厂中。
您的“轻量级实体”可以称为 DTO。
保持术语直截了当的一种方法。
- 实体由 ORM 管理。
- DTO 不受管理。通常用于传达实体的子集或集合。
通过复制一个对象的字段从另一个对象构造一个对象不是我认为的业务逻辑,除非业务需求规定了复杂的转换。
fromXYZ
方法的真正问题是它们实现了对 XYZ
的依赖。您必须注意此类依赖项指向的方向。例如,如果您通过将实体传递给 DTO 来构建 DTO,则该 DTO 现在对应用程序的持久层具有依赖性。如果您随后在服务中使用该 DTO,您的服务层现在对您的持久层具有(传递)依赖性。这被称为紧耦合。
保持业务逻辑与持久性、视图等分离的一种方法是将依赖指向另一个方向:进入服务而不是离开服务。