代码之家  ›  专栏  ›  技术社区  ›  Bruno Reis

数据层或域层上的规则验证?

  •  5
  • Bruno Reis  · 技术社区  · 15 年前

    我一直在阅读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...
    }
    

    在我工作的项目中,我有一个 领域层 ,尽可能的保持无知,以及 数据访问层 通过nhibernate实现数据访问,并实现在域层中定义接口的存储库。

    如果我按照作者的建议执行验证规则,关于 保存() “方法,它们将进入我的数据访问层,不过,至少我认为,它们应该驻留在域模型上!

    所以,我的问题是 :创建时 分层应用 ,用 领域层 实现域实体并向存储库公开接口(持久性忽略),一个 数据访问层 从域层实现存储库并实现所有数据访问代码, 验证规则应位于何处 ?

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

    谢谢。

    4 回复  |  直到 15 年前
        1
  •  2
  •   Buu    15 年前

    在MVC体系结构中,M(模型)包括 二者都 这个 领域层 数据访问层 . 所以Sanderson的例子没有错。

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

        2
  •  1
  •   Mac    15 年前

    他们绝对属于你 领域层 (在那里你可以实现 IDataErrorInfo ,但我认为这只对Windows窗体或WPF应用程序有用)。

    看起来这个验证原理与 Paul Stovell (退房 this article of his )它非常强大,我经常使用它。基本上:

    1. 拥有一个无效的业务对象没有什么错,只要你不尝试持久化它。
    2. 任何和所有被破坏的规则都应该可以从业务对象中检索,以便数据绑定以及您自己的代码可以查看是否有错误并进行适当的处理。

    所以,和你一样无知 领域层 是关于持久性的问题,我相信你的实体至少应该知道他们什么时候被持久化。这个 Save 方法是使它们对自己的持久性负责的一种方法(它们随后可以委托给 数据访问层 )我看不出这有什么问题。

        3
  •  0
  •   thinkbeforecoding    15 年前

    我通常更喜欢 始终有效 域对象。 域对象只能通过防止对象无效的方法进行更改。

    另一方面,表示对象可能包含临时的无效值,或者无法正确解析的值。但是,只有当数据有效时,表示层才会向域对象发出方法调用。

    域对象强制不变量,表示对象向用户指示如何修改其输入以尊重约束。

        4
  •  0
  •   J.R. Garcia    15 年前

    验证应该在域层中完成。您的业务逻辑是域的一部分,而不是数据访问。验证可能不在域对象本身(实际类)内部完成,但它应该位于域层内部。