ISession per Request (только при необходимости) - PullRequest
1 голос
/ 14 сентября 2010

Я занимаюсь разработкой приложения (asp.net mvc) и использую ISession для каждого запроса (в globa.asax я использую Bind и Unbind в событиях Begin_Request и End_Request).Все работает нормально, но иногда (некоторые запросы) мне не нужно использовать ISession (соединение с базой данных).

Я хотел бы знать, есть ли способ открыть ISession только тогда, когда мне нужно, и сделать запись ISession во всех запросах процесса (для совместного использования со всеми хранилищами и уникальным контекстом транзакции)?

Я занимаюсь разработкой и аукционом пенни, и у моего сервера будет много запросов в секунду, и иногда мне не нужно подключение, я использую кэш.

Спасибо

Приветствия

Ответы [ 2 ]

2 голосов
/ 14 сентября 2010

Следует отметить, что открытие сеанса не означает открытия соединения с базой данных. Как отмечается в этой статье , стоимость открытия сессии крайне низка. Так что, в общем, я бы не беспокоился о запросах на открытие сеанса, когда они не нужны; по сути, вы просто обновляете очень легкий объект.

2 голосов
/ 14 сентября 2010

Вы можете использовать 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) {
...