由于业务/域对象应该不知道它们的持久性,因此它们显然不能包含从数据库加载数据以初始化自身的代码。
另一方面,并非业务对象的所有属性都有公共(public) setter 来帮助封装并避免将它们设置为无效值。
这意味着当从数据库中获取数据时,没有其他类可以完全初始化业务对象。
由于以上所有都是常见的最佳实践,因此必须有一些解决该问题的方法。 那么谁应该负责构建业务对象并用数据库中的数据填充它们?
注意:我想到的唯一选择是将所有属性添加到构造函数中,我认为这非常不切实际。
最佳答案
这个问题的解决方案很少。但两者都不是“完美”的。
- 使用反射来设置私有(private)字段或属性。大多数 ORM 使用此解决方案。问题可能是当 ORM 设置属性时,它有一些逻辑,导致实体的不合逻辑状态(我被这个烧坏了很多次)。
- 将“数据持久性”抽象为键/值映射。这样,实体可以持久化自身并且仍然独立于特定的持久化技术。但是您仍然需要对此进行显式编码。
- builder 模式。具有具有相同属性的单独类,可以访问实体的私有(private)字段,但仅用于构造。主要缺点是每个实体都需要有构建器。
- 创建一个 DTO,反射(reflect)实体的状态,但不反射(reflect)实体的行为。然后该实体可以读取/创建此 DTO 以加载或保留自身。缺点同上。
我个人认为您的问题没有任何好的答案,除非您可以设法自动执行上述解决方案之一。通过代码生成或通过语言支持。例如,为“构建器模式”提供语言支持会大有帮助。
关于c# - 谁应该创建业务对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29744080/