首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDD ASP MVC验证最佳实践

问DDD ASP MVC验证最佳实践
EN

Stack Overflow用户
提问于 2013-12-16 05:57:02
回答 2查看 1.8K关注 0票数 3

在DDD中,来自业务层的领域模型和视图模型是不同的内容。视图模型代表了领域模型中的一些部分。

在ASP.MVC中,DataAnnotations和Fluent验证库是常用的验证机制。

在域模型和视图模型之间共享验证的最佳实践是什么?

我不喜欢为每个属性创建自定义验证属性的变体。

在控制器方法中,通过对域模型中的ModelState进行更新,可以在控制器中手动应用验证。但是它将是两次验证调用(一次是视图模型,另一次是域模型)。在ASP.NET MVC服务器引擎中关闭视图模型验证并同时使用JS客户端验证可能是一种简单的可能性。

EN

回答 2

Stack Overflow用户

发布于 2013-12-28 06:33:24

有一种说法是http://codebetter.com/gregyoung/2009/05/22/always-valid/。简而言之,实体不应包含验证,而应通过检查自身并抛出异常来强制执行“特定域”要求。有些人可能不同意这一点,但这是另一个话题。

考虑一下这个比喻:如果一个人不吃东西,它就会死。如果用户实体没有firstName,则会引发异常。

那么谁应该做验证呢?谁应该正确地知道域名需要什么?我的答案是域之前的层,在您的例子中是Controller。

如果您关心跨多个控制器或跨多个操作方法进行重复验证,那么应该考虑添加另一个称为“服务层”的层

服务层

此服务层的目的是封装(保护)您的域模型。您可能会认为这是您的控制器,但他们实际上有不同的责任。对于小型项目,服务层和控制器可以作为一个整体。

服务层+验证

在验证的上下文中,服务层应该充当一个“路障”,以保护您的域不陷入无效状态。这就是您进行“特定域”验证的地方。

服务层执行单响应原则,而不是与同一实体交互的多个控制器或多个动作方法。

服务层还允许您添加可测试性。

更多关于服务层的信息

关于服务层的教程

使用单元测试的服务层的示例实现

如果您考虑在服务层和表示层(带有数据注释)进行验证,请阅读https://stackoverflow.com/a/8075115/1027250。

票数 3
EN

Stack Overflow用户

发布于 2014-04-04 10:04:48

您不应该共享域验证和视图验证,它们应该是单独的层,并且这些层中的验证应该适用于不同的问题。

  • 在ViewModel和Controller中使用ViewModel DataAnnotations或FluentValidation验证用户输入,最好启用客户端验证
  • 使用自定义验证验证DomainModel和服务/业务层中的业务/域规则
  • 如果您有服务层为不同的使用者提供功能,则可能需要一些冗余的输入验证。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20604378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档