Validation 如何在域层进行验证

Validation 如何在域层进行验证,validation,dns,Validation,Dns,我经常看到人们通过创建规则对象来验证域对象,规则对象接受委托来执行验证。例如这个例子: 我不明白的是,仅仅说做一个方法有什么好处 例如,在那篇特定的文章中,有一个方法创建委托来检查字符串是否为空 但这不就是简单地拥有这样的东西吗: Bool validate() { Result = string.IsNullOrEmpty(name); } 当这些规则是上下文敏感的并且可能不会被共享时,为什么要麻烦地创建一个对象来保存规则并在委托中定义规则呢?方法也可以做到这一点。有几个原因: SR

我经常看到人们通过创建规则对象来验证域对象,规则对象接受委托来执行验证。例如这个例子:

我不明白的是,仅仅说做一个方法有什么好处

例如,在那篇特定的文章中,有一个方法创建委托来检查字符串是否为空

但这不就是简单地拥有这样的东西吗:

Bool validate()
{
    Result = string.IsNullOrEmpty(name);
}

当这些规则是上下文敏感的并且可能不会被共享时,为什么要麻烦地创建一个对象来保存规则并在委托中定义规则呢?方法也可以做到这一点。

有几个原因:

SRP-单一责任原则。对象不应对其自身的验证负责,它有自己的责任和存在的理由

此外,当涉及到复杂的业务规则时,明确说明这些规则可以使验证代码更易于编写和理解

业务规则也往往会发生很大的变化,比其他域对象变化更大,因此将它们分开有助于隔离变化


您发布的示例太简单,无法从成熟的验证对象中获益,但如果系统变大,验证规则变得复杂,则非常方便。

这里最明显的示例是一个Web应用程序:您填写表单并单击“提交”。您的一些数据出错。会发生什么

  • 某个对象抛出异常。某个对象(可能更高级别)捕获异常并打印它(可能您只捕获UserInputValidExceptions,假设其他异常应该被记录下来)。您看到了第一个错误
  • 您编写了一个validate()函数。它说“否”。您会向用户显示什么
  • 您编写了一个validate()函数,该函数返回(或引发异常,或追加)消息列表。您可以显示消息……但按字段分组,或将其显示在错误的字段旁边,不是很好吗?是否使用元组列表或列表元组?您希望规则占用多少行
将规则封装到对象中可以让您轻松地迭代规则并返回被破坏的规则。您不必为每个规则编写样板附加消息到列表代码。您可以将破坏的规则粘贴到破坏规则的字段旁边