数据或域层的规则验证?

Bru*_*eis 5 dns validation asp.net-mvc data-access-layer

我一直在阅读Pro ASP.NET MVC框架,Steven Sanderson,在第11章中讨论了数据验证.

在页390,我们看到将验证逻辑移动到您的模型层一节.在本节中,我们将在第392页中看到一些代码,说明如何实现验证.

代码实现了一个GetRuleViolations()方法,并且该Save()方法使用它来抛出一个RuleException不合适的东西.

但是,在我看来,域层和数据访问层之间没有区别,这里是代码:

public void Save() {
    var errors = GetRuleViolations();
    if (errors.Count > 0)
        throw new RuleException(errors);

    // Todo: Now actually save to the database or whatever
}
private NameValueCollection GetRuleViolations() {
    // validations...
}
Run Code Online (Sandbox Code Playgroud)

在我正在工作的项目中,我有一个Domain层,尽可能使用持久性,以及数据访问层,通过NHibernate实现数据访问,并实现在Domain层中定义接口的存储库.

如果我按照作者在这里提出的那样实现验证规则,那么在" Save()"方法中,它们会进入我的数据访问层,但至少我认为它们应该驻留在域模型上!

所以,我的问题是:在创建分层应用程序时,使用域层实现域实体并将接口暴露给存储库(持久性无知),数据访问层从域层实现存储库并实现所有数据访问代码,其中验证规则应该存在吗?

我的主要(或至少是第一个)接口将是ASP.NET MVC应用程序,如果这可能会改变任何东西.

谢谢.

Buu*_*yen 2

在MVC架构中,M(模型)包括领域数据访问层。所以桑德森的例子并没有什么问题。

也就是说,当您使用这两个层(而不是只有一个)实现域模型时,验证逻辑应该转到域层以增加域对象的内聚性,并避免验证逻辑在许多地方重复(例如在每个具体的地方)。存储库)。