Validation 对域实体和MVP进行验证

Validation 对域实体和MVP进行验证,validation,domain-driven-design,mvp,Validation,Domain Driven Design,Mvp,如何在MVP/域环境中应用验证 让我用一个例子来说明: 域实体: class Customer { string Name; etc. } MVP模式 class CustomerModel { string Name; etc. } 我想对我的域实体应用验证,但MVP模型有自己的模型/类 除了域实体,这是否意味着我必须复制验证代码 还要处理MVP模型吗 我提出的一个解决方案是放弃MVP模型,使用域实体作为MVP模型, 但我不想将数据设置为尚未验证的实体。 第二个问题是,

如何在MVP/域环境中应用验证

让我用一个例子来说明:

域实体:

class Customer
{
  string Name;
  etc.
}
MVP模式

class CustomerModel
{
   string Name;
   etc.
}
我想对我的域实体应用验证,但MVP模型有自己的模型/类 除了域实体,这是否意味着我必须复制验证代码 还要处理MVP模型吗

我提出的一个解决方案是放弃MVP模型,使用域实体作为MVP模型, 但我不想将数据设置为尚未验证的实体。 第二个问题是,如果实体已通知事件, 应用程序的其他部分将受到错误数据的影响

这种方法的第三件事是,如果用户编辑了一些数据,然后取消了编辑,我如何恢复到旧值?(实体可能不是来自DB,因此在所有情况下都不可能重新加载实体)

另一种解决方案是对有问题的实体进行某种形式的复制/克隆,并使用副本作为MVP模型,但如果实体有一个大的对象图,则可能会遇到麻烦


有人对这些问题有一些建议吗?

限制人名之类的内容可能不属于域模型,除非在客户的公司中,实际上有一条规则规定他们不与姓名超过96个字符的客户做生意

字符串长度等不是域的问题——两个使用相同模型的不同应用程序可能有不同的需求,具体取决于UI、持久性约束和用例

一方面,你要确保一个人的模型是完整和准确的,但要考虑你正在建模的“真实世界”的人。没有关于长度的规则,也没有逻辑推论“哎呀,给这个人起名字有问题。”一个人只有一个名字,所以我认为演示者有责任在填充域模型之前验证用户输入的内容,因为数据的格式是应用程序比域更关心的问题

此外,正如Udi Dahan在文章中解释的那样,我们使用域模型模式来封装可能发生更改的规则。一个人不应该有一个空名字,这不是一个很可能会改变的要求

我可以考虑在域实体中使用<代码> Debug .AsjtType()/Cuth>,只是为了通过集成和/或手动测试来添加一层保护,如果我真的关心一个空的名字潜入,但是类似长度的东西,也不属于那里。

不要直接使用您的域实体——保留该表示层;你会需要它的。您列出了直接使用实体的三个非常实际的问题(我认为Udi Dahan的文章也谈到了这一点)

您的域模型不应该默认应用程序的需要,很快您的UI将需要一个事件或集合过滤器,您只需要将其固定到该实体中。让表示层作为适配器,每个层都能够保持其完整性


让我明确一点,域模型不必没有验证,但它包含的验证应该是特定于域的。例如,当试图给某人加薪时,可能会有一个要求,即在最后一次加薪后的6个月内不能加薪,因此您需要验证加薪的生效日期。这是一个业务规则,可能会发生更改,并且绝对属于域模型。

约束某人的姓名之类的内容可能不属于域模型,除非在客户的公司中,实际上有一条规则,即他们不与姓名超过96个字符的客户做生意

字符串长度等不是域的问题——两个使用相同模型的不同应用程序可能有不同的需求,具体取决于UI、持久性约束和用例

一方面,你要确保一个人的模型是完整和准确的,但要考虑你正在建模的“真实世界”的人。没有关于长度的规则,也没有逻辑推论“哎呀,给这个人起名字有问题。”一个人只有一个名字,所以我认为演示者有责任在填充域模型之前验证用户输入的内容,因为数据的格式是应用程序比域更关心的问题

此外,正如Udi Dahan在文章中解释的那样,我们使用域模型模式来封装可能发生更改的规则。一个人不应该有一个空名字,这不是一个很可能会改变的要求

我可以考虑在域实体中使用<代码> Debug .AsjtType()/Cuth>,只是为了通过集成和/或手动测试来添加一层保护,如果我真的关心一个空的名字潜入,但是类似长度的东西,也不属于那里。

不要直接使用您的域实体——保留该表示层;你会需要它的。您列出了直接使用实体的三个非常实际的问题(我认为Udi Dahan的文章也谈到了这一点)

您的域模型不应该默认应用程序的需要,很快您的UI将需要一个事件或集合过滤器,您只需要将其固定到该实体中。让表示层作为适配器,每个层都能够保持其完整性

让我明确一点,域模型不必没有验证,但它包含的验证应该是特定于域的。例如,当试图给某人加薪时,可能会有一个要求,即在上一次加薪后的6个月内不能加薪,因此您需要