【发布时间】:2011-09-21 23:32:39
【问题描述】:
在我从事过的大多数 Web 服务应用程序中,我都经历过以下场景:
- 我们创建一个领域模型(在 C# 中)。这是应用程序的核心。领域模型包含业务和验证规则,用于确定实体在什么条件下有效。
- 我们创建一个“Web 服务”层(在 C#/WCF 中)。 这一层定义了由 Web 服务公开的类似 DTO 的对象。 类似 DTO 的对象是从域实体的片段中分割和组装的,通常以粗粒度的方式。
- 在网络客户端(JavaScript 和 HTML)上,验证规则以不同的格式重复,通常是某种形式的 JavaScript 验证。
附加到域实体片段的验证规则如何通过 Web 服务向客户端公开?这样做的原因是域模型的验证规则应该定义一次,然后在整个系统的其余部分以某种格式提供给消费者客户端。
到目前为止,我提出的唯一解决方案是使域中的验证规则以某种形式的元数据可用,以 XML、JSON 或类似形式定义。最大的问题是服务层的 DTO 和域实体之间的模式不同,因此域的验证规则不能直接发送到 Web 客户端——客户端使用不同的模式和域模型。
因此我的问题是:什么方法需要最少的手动和重复代码,在应用程序中的不同架构和层之间进行映射,但允许一切解释验证规则?
【问题讨论】:
-
为什么不直接序列化您的域对象,而不是创建具有不同验证规则的不同 DTO?除非您想更改域对象但保持服务层不变,否则我看不到此转换添加了什么。
-
定义服务 DTO 的原因有很多。使用该服务的 UI 客户端具有与域不同的架构要求。在 REST 中,您将定义和传输 REST 资源。域实体附加了很多东西,这对服务客户没有意义。它符合 SOA 最佳实践……等等等等。
-
有趣,我认为服务层是应用程序的核心,因为它定义了公开的信息和可用的功能。抱歉,我没有你的问题的答案。我首先想到了OCL(对象约束语言),但那是我只听说过的。
标签: c# javascript web-services validation domain-driven-design