迷恋弦哥

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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的类,代码如下:

View Code
[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布置属性,代码如下:

View Code
[NeedsPersistence]
public ActionResult Index()
{
  return View(DataAccessLayer.GetBooks());
}

3.   更新DataAccessLayer.GetBooks()方法,代码如下:

View Code
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.

posted on 2012-07-14 21:52  迷恋弦哥  阅读(239)  评论(0编辑  收藏  举报