c# - DDD ASP MVC 验证最佳实践

标签 c# asp.net-mvc validation

在 DDD 中,业务层的域模型和 View 模型是不同的实体。 View 模型代表领域模型的一些部分。

在 ASP MVC 中,DataAnnotations 和 Fluent Validation Library 通常用作验证机制。

在域模型和 View 模型之间共享验证的最佳做法是什么?

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

附言我们可以通过在 Controller 方法中从域模型更新 ModelState 来手动在 Controller 中应用验证。但这将是两次验证调用(一次通过 View 模型,一次通过领域模型)。可能有一种简单的方法可以关闭 ASP.NET MVC 服务器引擎中的 View 模型验证,同时使用 JS 客户端验证。

最佳答案

有一个学派认为 "A domain entity should always be valid" .简而言之,实体不应包含验证,而应通过检查自身然后抛出异常来执行“特定于域”的要求。有些人可能不同意这一点,但这是另一个话题。

考虑这个类比:如果 body 不进食,它就会死亡。如果用户实体没有名字,它会抛出异常。

那么谁应该做验证?谁应该正确地知道域需要什么?我的答案是域之前的层,在您的情况下是 Controller

如果您担心跨多个 Controller 或多个操作方法进行重复验证,那么您应该考虑添加另一个名为“服务层”

的层

服务层

此服务层的目的是封装(保护)您的领域模型。你可能认为这是你的 Controller ,但实际上他们有不同的职责。对于小型项目,服务层和 Controller 可以合二为一。

服务层 + 验证

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

服务层强制执行单一职责原则,而不是多个 Controller 或多个操作方法与同一实体交互。

服务层还使您能够添加可测试性。

More about service layer

Tutorial about service layer

Sample implementation of the service layer with Unit Testing

如果您担心在服务层和表示层(使用数据注释)都进行验证,请阅读 https://stackoverflow.com/a/8075115/1027250

关于c# - DDD ASP MVC 验证最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20604378/

相关文章:

asp.net-mvc - BeginForm 与 IEnumerable

php - 使用PHP的动态输入字段的错误消息

c# - Type.GetType(string typeName) 返回 null

c# - C# 中的深层克隆对象

c# - 依赖注入(inject)无法与具有 Azure Key Vault Value asp.net core 3.0 的 RabbitMQ Service Bus 一起使用

javascript - 使用 JavaScript 验证表单时检查特殊字符 (, ; .)

validation - 提交的输入值为 null 时未调用 JSF 自定义验证器

C#:关于 ToUpper() 和 ToLower() 的混淆

ASP.NET Core 使用不同的环境应用程序设置进行发布

javascript - Google Charts 加载多列图表时出现问题