【问题标题】:NHibernate and NHibernate ValidationNHibernate 和 NHibernate 验证
【发布时间】:2011-09-22 06:09:02
【问题描述】:

是否可以在 PreTranctionCommint 事件中使用 Nhibernate 验证框架来验证域模型?如果可能的话,我们如何编写这个事件?

【问题讨论】:

    标签: nhibernate nhibernate-validator


    【解决方案1】:

    是否可以使用 Nhibernate 验证来验证域模型 框架...?

    如果你真的有domain model 那么它不需要验证框架。换句话说,对象封装了行为并保护了它们的内部不变量,而不依赖于外部的魔法验证框架。域对象永远不会在first place 中进入“无效”状态。如果它们是长期存在的,那么它们也应该是“始终持久的”。您的域对象的有效性不应依赖于数据访问库可能触发或不触发的事件。您还会发现不考虑 VALIDATION 很有帮助,因为它过于笼统且依赖于上下文,而是考虑业务对象 INVARIANTS。您不需要第三方框架来正确地在对象中强制执行不变量。如果不将域类耦合到验证框架,实现它真的不难。

    但是,如果您将问题改写为:

    是否可以使用 Nhibernate 验证来验证 anemic 域模型 框架...?

    那么答案是:是的,去吧,太棒了!但请记住,随着复杂性的增加,您可能希望强制执行涉及多个对象字段、单独的域服务等的更复杂的域规则。您将通过编写“自定义验证器”来越来越多地与验证框架耦合,或者干脆放弃它最终得到一些由框架实现的规则,而其他规则则遍布整个代码库。可能值得看看这个answer 和一般的 DDD。

    【讨论】:

    • 你不能验证域模型中的所有内容,最简单的情况是当你有开始和结束日期时,一些规则需要从数据库中读取,我更喜欢在门上应用验证(插入,更新,删除)并列出所有违反规则的异常(这将有助于其他层)
    【解决方案2】:

    以下摘自http://nhforge.org/wikis/validator/nhibernate-validator-1-0-0-documentation.aspx

    NHibernate 基于事件的验证

    NHibernate Validator 有两个内置的 NHibernate 事件监听器。 每当 PreInsertEvent 或 PreUpdateEvent 发生时,侦听器将 验证实体实例的所有约束并抛出异常 如果其中任何一个被违反。基本上,之前会检查对象 任何插入和在 NHibernate 触发的任何更新之前。这个 包括级联变化!这是最方便最简单的 激活验证过程的方法。如果违反了约束, 该事件将引发运行时 InvalidStateException,其中包含 描述每个失败的 InvalidValues 数组。

    【讨论】:

    • 感谢 Cole W。是否可以在事务提交事件上编写我们自己的侦听器。如果是,这是验证此事件的正确方法吗?
    • 如果您设置 nhibernate 验证器以与 nhibernate 集成,您的实体将在 Commit 上得到验证。
    【解决方案3】:

    这个怎么样?

    using(transaction...)
    {
        validationA();
        validationB();
        session.saveOrUpdate();(do some transaction)
    }
    

    【讨论】:

    • 请用解释扩展你的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多