【发布时间】:2011-01-13 03:44:33
【问题描述】:
我有一个丰富的域模型,其中大多数类都有一些行为和一些属性,这些属性要么是计算出来的,要么是暴露成员对象的属性(也就是说,这些属性的值永远不会被持久化)。
我的客户端仅通过 WCF 与服务器通信。
因此,对于每个域实体,我都有一个相应的 DTO——一个仅包含数据的简单表示——以及一个实现 DtoMapper<DTO,Entity> 并且可以将实体转换为其 DTO 等效项的映射器类,或者通过静态网关反之亦然:
var employee = Map<Employee>.from_dto<EmployeeDto>();
这个应用程序的服务器端主要是关于持久性,我的 DTO 从 WCF 服务进来,被反序列化,然后任意 ORM 将它们持久化到数据库,或者从 WCF 进来一个查询请求并执行 ORM该查询针对 DB 并返回要序列化的对象并由 WCF 发回。
鉴于这种情况,将我的持久性存储映射到域实体是否有意义,还是应该直接映射到 DTO?
如果我使用域实体,流程将是
- 客户端请求对象
- WCF 将请求传输到服务器
- ORM 查询数据库并返回域实体
- 映射器将域实体转换为 DTO
- WCF 序列化 DTO 并返回给客户端
- 客户端反序列化 DTO
- DTO 通过 mapper 转化为域实体
- 已创建视图模型,等
回程类似
如果我直接映射到 DTO,我可以消除每个对象、每个请求的一个映射。这样做会失去什么?
唯一想到的是在插入/更新之前验证的另一个机会,因为我不能保证 DTO 在通过网络发送之前是否经过验证甚至作为域实体存在,我猜验证选择的机会(如果另一个进程可能在数据库中放置了无效值)。还有其他原因吗?这些理由是否足以保证额外的映射步骤?
编辑:
我确实在上面说过“任意 ORM”,并且我确实希望事情尽可能与 ORM 和持久性无关,但是如果您有任何特殊的东西要添加到特定于 NHibernate 的内容,请务必这样做。
【问题讨论】:
标签: .net serialization orm mapping dto