在DDD中,来自业务层的领域模型和视图模型是不同的内容。视图模型代表了领域模型中的一些部分。
在ASP.MVC中,DataAnnotations和Fluent验证库是常用的验证机制。
在域模型和视图模型之间共享验证的最佳实践是什么?
我不喜欢为每个属性创建自定义验证属性的变体。
在控制器方法中,通过对域模型中的ModelState进行更新,可以在控制器中手动应用验证。但是它将是两次验证调用(一次是视图模型,另一次是域模型)。在ASP.NET MVC服务器引擎中关闭视图模型验证并同时使用JS客户端验证可能是一种简单的可能性。
发布于 2013-12-28 06:33:24
有一种说法是http://codebetter.com/gregyoung/2009/05/22/always-valid/。简而言之,实体不应包含验证,而应通过检查自身并抛出异常来强制执行“特定域”要求。有些人可能不同意这一点,但这是另一个话题。
考虑一下这个比喻:如果一个人不吃东西,它就会死。如果用户实体没有firstName,则会引发异常。
那么谁应该做验证呢?谁应该正确地知道域名需要什么?我的答案是域之前的层,在您的例子中是Controller。
如果您关心跨多个控制器或跨多个操作方法进行重复验证,那么应该考虑添加另一个称为“服务层”的层
服务层
此服务层的目的是封装(保护)您的域模型。您可能会认为这是您的控制器,但他们实际上有不同的责任。对于小型项目,服务层和控制器可以作为一个整体。
服务层+验证
在验证的上下文中,服务层应该充当一个“路障”,以保护您的域不陷入无效状态。这就是您进行“特定域”验证的地方。
服务层执行单响应原则,而不是与同一实体交互的多个控制器或多个动作方法。
服务层还允许您添加可测试性。
如果您考虑在服务层和表示层(带有数据注释)进行验证,请阅读https://stackoverflow.com/a/8075115/1027250。
发布于 2014-04-04 10:04:48
您不应该共享域验证和视图验证,它们应该是单独的层,并且这些层中的验证应该适用于不同的问题。
https://stackoverflow.com/questions/20604378
复制相似问题