2

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

4

3 回答 3

4

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

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

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

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

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

于 2011-09-23T00:27:33.780 回答
2

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

NHibernate 基于事件的验证

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

于 2011-09-22T12:43:05.920 回答
0

这个怎么样?

using(transaction...)
{
    validationA();
    validationB();
    session.saveOrUpdate();(do some transaction)
}
于 2017-08-21T17:24:29.300 回答