是否可以在PreTranctionCommint事件中使用Nhibernate验证框架验证域模型?如果可能,我们如何撰写此活动?
答案 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)
}