2011-09-22 99 views
2

是否可以使用PreTranctionCommint事件中的Nhibernate验证框架验证域模型?如果可能的话,我们如何写这个活动?下面NHibernate和NHibernate验证

回答

2

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

基于事件NHibernate的验证采取

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

+0

感谢Cole W.有可能在事务提交事件上编写我们自己的侦听器。如果是的话,这是正确的方式来验证这个事件? – viky

+0

如果您将nhibernate验证器设置为与nhibernate集成,您的实体将在Commit上进行验证。 –

4

是否可以验证与NHibernate验证 框架的域模型...?

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

但是,如果你改一下你的问题:

是否可以验证与NHibernate验证 框架anemic域模型...?

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

+0

感谢德米特里,我从您的答案中获得更多知识 – viky

+0

Downvoter会关心评论吗? – Dmitry

+0

您无法验证域模型中的所有内容,最简单的情况是您有开始日期和结束日期,某些规则需要从数据库读取,我更愿意在(插入,更新,删除)时应用验证,例外列出所有违规规则(这将有助于其他图层) –

0

这个怎么样?

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

请用解释扩展您的答案。 –