【发布时间】:2011-09-22 06:09:02
【问题描述】:
是否可以在 PreTranctionCommint 事件中使用 Nhibernate 验证框架来验证域模型?如果可能的话,我们如何编写这个事件?
【问题讨论】:
标签: nhibernate nhibernate-validator
是否可以在 PreTranctionCommint 事件中使用 Nhibernate 验证框架来验证域模型?如果可能的话,我们如何编写这个事件?
【问题讨论】:
标签: nhibernate nhibernate-validator
是否可以使用 Nhibernate 验证来验证域模型 框架...?
如果你真的有domain model 那么它不需要验证框架。换句话说,对象封装了行为并保护了它们的内部不变量,而不依赖于外部的魔法验证框架。域对象永远不会在first place 中进入“无效”状态。如果它们是长期存在的,那么它们也应该是“始终持久的”。您的域对象的有效性不应依赖于数据访问库可能触发或不触发的事件。您还会发现不考虑 VALIDATION 很有帮助,因为它过于笼统且依赖于上下文,而是考虑业务对象 INVARIANTS。您不需要第三方框架来正确地在对象中强制执行不变量。如果不将域类耦合到验证框架,实现它真的不难。
但是,如果您将问题改写为:
是否可以使用 Nhibernate 验证来验证 anemic 域模型 框架...?
那么答案是:是的,去吧,太棒了!但请记住,随着复杂性的增加,您可能希望强制执行涉及多个对象字段、单独的域服务等的更复杂的域规则。您将通过编写“自定义验证器”来越来越多地与验证框架耦合,或者干脆放弃它最终得到一些由框架实现的规则,而其他规则则遍布整个代码库。可能值得看看这个answer 和一般的 DDD。
【讨论】:
以下摘自http://nhforge.org/wikis/validator/nhibernate-validator-1-0-0-documentation.aspx
NHibernate 基于事件的验证
NHibernate Validator 有两个内置的 NHibernate 事件监听器。 每当 PreInsertEvent 或 PreUpdateEvent 发生时,侦听器将 验证实体实例的所有约束并抛出异常 如果其中任何一个被违反。基本上,之前会检查对象 任何插入和在 NHibernate 触发的任何更新之前。这个 包括级联变化!这是最方便最简单的 激活验证过程的方法。如果违反了约束, 该事件将引发运行时 InvalidStateException,其中包含 描述每个失败的 InvalidValues 数组。
【讨论】:
这个怎么样?
using(transaction...)
{
validationA();
validationB();
session.saveOrUpdate();(do some transaction)
}
【讨论】: