NHibernate和NHibernate验证

时间:2011-09-22 06:09:03

标签: nhibernate nhibernate-validator

是否可以在PreTranctionCommint事件中使用Nhibernate验证框架验证域模型?如果可能,我们如何撰写此活动?

3 个答案:

答案 0 :(得分:4)

  

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

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

但如果你将问题改为:

  

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

然后答案是:是的,去吧,真棒!但请记住,随着复杂性的增加,您需要实施更复杂的域规则,涉及多个对象字段,单独的域服务等。您将通过编写“自定义验证器”或者放弃它来越来越多地与验证框架耦合。并最终得到一些框架实现的规则和其他遍布代码库的规则。可能值得一看这个answer和DDD。

答案 1 :(得分:2)

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

  

NHibernate基于事件的验证

     

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

答案 2 :(得分:0)

怎么样?

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