NHibernate.3.0.Cookbook第三章第5节的翻译

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.

转载于:https://www.cnblogs.com/carfieldSE/archive/2012/07/14/2591864.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值