首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >查看模型验证与域模型验证

查看模型验证与域模型验证
EN

Stack Overflow用户
提问于 2013-07-18 18:38:46
回答 3查看 4.7K关注 0票数 21

如果client validation已经完成,什么时候需要执行domain level validation

我将ASP.NET MVC用于我的web应用程序。我喜欢区分我的domain modelsview models。我的域模型包含来自我的数据库的数据,我的视图模型包含我视图/页面上的数据。

假设我正在处理客户数据。

我的数据库中将有一个名为Customers的表。

我将拥有一个类似如下所示的customer类:

代码语言:javascript
复制
public class Customer
{
     public int Id { get; set; }

     public string FirstName { get; set; }

     public string LastName { get; set; }

     public DateTime DateOfBirth { get; set; }
}

我将创建一个customer视图模型来仅表示我的视图上的数据:

代码语言:javascript
复制
[Validator(typeof(CustomerCreateViewModelValidator))]
public class CustomerCreateViewModel
{
     public string FirstName { get; set; }

     public string LastName { get; set; }

     public DateTime DateOfBirth { get; set; }
}

我将拥有一个创建视图,它接受我的CustomerCreateViewModel并将输入字段绑定到视图模型:

代码语言:javascript
复制
@model MyProject.ViewModels.Customers.CustomerCreateViewModel

@using (Html.BeginForm())
{
     <table>
          <tr>
               <td>
                    @Html.TextBoxFor(x => x.FirstName)
                    @Html.ValidationMessageFor(x => x.FirstName)
               </td>
          </tr>
          <tr>
               <td>
                    @Html.TextBoxFor(x => x.LastName)
                    @Html.ValidationMessageFor(x => x.LastName)
               </td>
          </tr>
     </table>

     <button id="SaveButton" type="submit">Save</button>
}

如您所见,我有一个包含验证规则的CustomerCreateViewModelValidator。在用户向文本框中输入一些数据后,他将单击submit按钮。如果某些字段为空,则验证失败。如果所有必填字段都已输入,则验证成功。然后我将把数据从我的视图模型映射到我的域模型,如下所示:

代码语言:javascript
复制
Customer customer = Mapper.Map<Customer>(viewModel);

这个客户领域模型,我将其传递到我的存储库层,它将数据添加到我的表中。

何时需要对域模型进行验证?我在我的视图模型上做所有的验证。我可以在将数据添加到数据库之前对域模型中的数据进行验证,但是如果看到它是在视图模型上进行验证的,那么它不就是在客户端复制相同的验证吗?

有没有人可以分享一些关于验证的问题?

EN

回答 3

Stack Overflow用户

发布于 2013-07-25 02:45:47

作为一般规则,我认为域模型是最重要的代码,因此它的状态管理是神圣的。出于这个原因,我永远不会假设域模型处于有效状态,因为它是由应该强制执行有效性的表示层操作的。这将意味着您的域层与您的表示层紧密耦合。

最好从领域模型向外(onion architecture)开始思考。所有这一切背后的原因是,域模型最不可能随着时间的推移而改变,并且充当应用程序的核心,将各层与其他层的缺陷隔离开来。

因此,从强制执行其自身有效性的域模型开始,您就会遇到验证代码重复的问题。有一些方法可以避免这种情况。例如,您的视图模型可能会尝试创建域对象,并将抛出的任何异常转换为验证失败。验证器也可以被提取和重用。根据你的用例,你必须看看什么最适合你。只要注意保持简单即可。也许,如果您的用例不是这样的话,简单地重复验证可能是最容易维护的。请记住,重复数据删除会增加复杂性。

我见过只由域层处理验证的代码库,以及同时在域和表示层中处理验证的代码库。在这一点上,我倾向于简单地复制验证逻辑,因为我已经看到了将域验证错误很好地映射到上下文用户界面是多么困难。

票数 7
EN

Stack Overflow用户

发布于 2013-07-18 18:51:24

我倾向于将客户端验证看作是在UI级别对数据进行更多的清理。换句话说,例如,检查作为数字的输入字段是否由用户给予数字。或者文本输入的长度是否满足最小长度要求。诸如此类的东西。

在域级别,您应该检查业务域规则。例如,如果用户正在输入有关新产品的详细信息,则该产品名称是否已经存在?或者在配置新用户时,根据该用户的技能检查该用户是否选择了有效的部门?这只是一些空洞的例子,但我希望它们能让我明白我的意思。

票数 2
EN

Stack Overflow用户

发布于 2013-07-18 18:44:33

如果您的模型有多个客户端,则需要有一个模型验证器。例如,如果您有WPF调用您的模型和ASP.NET应用程序,在这种情况下,在模型上具有验证逻辑是有意义的。但是在你的例子中,你只有一个客户端,那就太过分了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17721170

复制
相关文章

相似问题

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