1

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

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

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

谢谢

干杯

4

2 回答 2

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) {
于 2010-09-13T21:21:55.900 回答
2

需要注意的是,打开会话并不意味着打开与数据库的连接。如本文所述,打开会话的成本极低。所以,一般来说,我不会担心请求在不需要时打开会话;本质上,您只是在更新一个非常轻量级的对象。

于 2010-09-14T11:11:57.330 回答