【发布时间】:2013-12-04 04:52:00
【问题描述】:
我有一个 WCF 层,我的领域模型位于这个 WCF 层后面。我使用 Nhibernate 作为 ORM 工具,我所有的业务逻辑/数据访问等都将在这个 WCF 层之后。
我将 DTO 暴露给我的客户。我有以下问题
1) 我应该创建 DTO 吗?将实体直接暴露给 wcf 客户端是否有任何危害,因为我的实体也将具有业务逻辑方法,因此我将不得不使用我认为不好的 WCF 属性破坏我的实体对象?
2) 如果我公开 DTO,我是否应该验证 DTO 以及实体。如果我只验证 DTO,那么我不会为我的 Enitity 对象提供任何输入验证。这样可以吗?
3) 我是否应该考虑使用模式验证来验证应用程序服务层(WCF 层)中的 DTO?或者我应该使用文章 [博客] 中给出的 IValidator 方法:http://lostechies.com/jimmybogard/2007/10/24/entity-validation-with-visitors-and-extension-methods/,如 Jimmy Bogard 所示
有时拥有 DTO 对我来说似乎是多余的,但我可以使用它来收集来自一个或多个实体的详细信息。
我会将这项服务公开给各种客户端,因此我的 DTO 将派生自一些具有凭据详细信息的基本 dto,我将在我的实际 wcf 方法调用之前检查每个传入的请求(可能使用 IEndpointBehaviour 和 IParamInspector)
编辑
基于我现在有点同意保留 DTO 层的响应,这是一个示例,以便场景变得更加明确
假设我的 WCF 应用程序服务层中有 CreateCustomer 方法接受 CustomerDetailsDTO,它可能由 MVC 应用程序调用。有一些输入验证,例如
输入验证:
业务验证:
然后可能会有一些业务规则来检查重复的客户基于说电子邮件或其他一些我认为应该是我的域业务逻辑的一部分并且应该驻留在 CustomerEntity 类中的因素。
当我们从客户端获取 DTO 时,输入验证是否应该仅应用于服务接口层 或者它也应该应用于 CustomerEntity
【问题讨论】:
标签: c# wcf validation nhibernate domain-driven-design