c# - 谁应该创建业务对象?

标签 c# data-access-layer domain-model

由于业务/域对象应该不知道它们的持久性,因此它们显然不能包含从数据库加载数据以初始化自身的代码。

另一方面,并​​非业务对象的所有属性都有公共(public) setter 来帮助封装并避免将它们设置为无效值。

这意味着当从数据库中获取数据时,没有其他类可以完全初始化业务对象。

由于以上所有都是常见的最佳实践,因此必须有一些解决该问题的方法。 那么谁应该负责构建业务对象并用数据库中的数据填充它们?

注意:我想到的唯一选择是将所有属性添加到构造函数中,我认为这非常不切实际。

最佳答案

这个问题的解决方案很少。但两者都不是“完美”的。

  1. 使用反射来设置私有(private)字段或属性。大多数 ORM 使用此解决方案。问题可能是当 ORM 设置属性时,它有一些逻辑,导致实体的不合逻辑状态(我被这个烧坏了很多次)。
  2. 将“数据持久性”抽象为键/值映射。这样,实体可以持久化自身并且仍然独立于特定的持久化技术。但是您仍然需要对此进行显式编码。
  3. builder 模式。具有具有相同属性的单独类,可以访问实体的私有(private)字段,但仅用于构造。主要缺点是每个实体都需要有构建器。
  4. 创建一个 DTO,反射(reflect)实体的状态,但不反射(reflect)实体的行为。然后该实体可以读取/创建此 DTO 以加载或保留自身。缺点同上。

我个人认为您的问题没有任何好的答案,除非您可以设法自动执行上述解决方案之一。通过代码生成或通过语言支持。例如,为“构建器模式”提供语言支持会大有帮助。

关于c# - 谁应该创建业务对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29744080/

相关文章:

c# - Xamarin Forms webview 未在设备上显示

c# - SurroundsWith Snippet for VS2012 给出了一个选择

c# - 将 IOrderedEnumerable<KeyValuePair<string, int>> 转换为 Dictionary<string, int>

database - Grails:处理现有数据库的最佳方法

hibernate - 暂时禁用Grails自动标记

c# - 带有可选 WHERE 选项的 Linq

.net - .Net 初学者应该费心使用 ORM 还是等到他获得更多经验?

data-access-layer - 在 DLL 对象中编写一堆 2 个线性函数只是为了重新路由到 DAL 是否值得?

c# - 如何在数据访问层管理 SqlDataReader?

maven - 从 Spring Roo 项目中提取域类