每个请求的ISession(仅在必要时)

时间:2010-09-13 20:55:26

标签: nhibernate orm request sessionfactory isession

我正在开发一个应用程序(asp.net mvc),我正在使用每个请求的ISession(在globa.asax中我在Begin_Request事件和End_Request事件中使用Bind和Unbind)。一切正常但有时(一些请求)我不需要使用ISession(与数据库的连接)。

我想知道是否有任何方法只在我需要并在所有流程请求中创建ISession条目(与所有存储库和独特的事务上下文共享)时才打开ISession?

我是开发和便士拍卖网站,我的服务器每秒会有很多请求,有时我不需要连接,我会使用缓存。

由于

干杯

2 个答案:

答案 0 :(得分:2)

您可以使用ActionFilter执行此操作。这是我用来完成你描述的那个。

public class UsingNhibernate : ActionFilterAttribute {
    private ISession nhSession;
    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        nhSession = NHHelper.OpenSession();
        nhSession.BeginTransaction();
        // set an accessible reference to your nhSession for access from elsewhere
        //   ((ApplicationController)filterContext.Controller).nHSession = nhSession; is what I do
        base.OnActionExecuting(filterContext);
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext) {
        try {
            if (filterContext.Exception == null && nhSession != null && nhSession.Transaction.IsActive)
                nhSession.Transaction.Commit();
            else if (nhSession != null && nhSession.Transaction.IsActive)
                nhSession.Transaction.Rollback();
        } catch (Exception ex) {
            if (nhSession != null && nhSession.Transaction.IsActive)
                nhSession.Transaction.Rollback();
            nhSession.Dispose();
            throw;
        }
        nhSession.Dispose();
        base.OnActionExecuted(filterContext);
    }
}

在每个适当的控制器操作上(或者甚至在控制器级别上应用于所有操作),您只需添加UsingNhibernate操作过滤器,如下所示:

[UsingNhibernate]
public ActionResult SaveSystemSetting(SystemAdminVM item) {

答案 1 :(得分:2)

应该注意,打开会话并不意味着打开与数据库的连接。如this article所述,开会的成本非常低。所以,一般来说,我不担心在他们不需要的时候开会的请求;基本上你只是在新建一个非常轻量级的对象。