Creating a Transaction ASP.NET MVC action filter
使用ASP.NET MVC动作过滤器(action filter)创建事务
我们可以将前面小节概念扩展到NHibernate事务.本节介绍如何通过创建一个action filter来管理NHibernate会话和事务.
准备
完成前面的示例:Creating a Session ASP.NET MVC action filter .
步骤
1. 添加名为NeedsPersistenceAttribute的类,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[AttributeUsage(AttributeTargets.Method, AllowMultiple=true)] public class NeedsPersistenceAttribute : NHibernateSessionAttribute { protected ISession session { get { return sessionFactory.GetCurrentSession(); } } public override void OnActionExecuting( ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); session.BeginTransaction(); } public override void OnActionExecuted( ActionExecutedContext filterContext) { var tx = session.Transaction; if (tx != null && tx.IsActive) session.Transaction.Commit(); base.OnActionExecuted(filterContext); } }
2. 为controller actions布置属性,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[NeedsPersistence] public ActionResult Index() { return View(DataAccessLayer.GetBooks()); }
3. 更新DataAccessLayer.GetBooks()方法,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var session = MvcApplication.SessionFactory .GetCurrentSession(); var books = session.QueryOver<Eg.Core.Book>() .List(); return books;
4. 编译运行,结果如下图:
原理
在ASP.NET MVC执行controller action之前,NeedsPersistence动作筛选器会打开一个新的会话和NHibernate事务.如果一切正常,一旦action完成,筛选器会提交事务. 如果controller action回滚事务,那么没有action会被执行.
请注意,在数据访问层中,没有必要在使用事务,因为整个的controller action被包装到一个事务里.
扩展
这个attribute继承自前面小节示例中定义的会话action filter.如果你使用不同的方法管理会话,比如session-per-request模式,会继承ActionFilterAttribute.