Как я могу сделать что-то внутри контроллера в конце запроса? - PullRequest
2 голосов
/ 16 марта 2012

Я хочу удалить объект NHibernate Session в конце запроса контроллера, то есть после рендеринга представления и всего.Где мне это сделать?

Ответы [ 3 ]

4 голосов
/ 16 марта 2012

Вы можете создать свой собственный фильтр пользовательских действий и переопределить OnResultExecuted .

Просто для реакции в конце запроса контроллера, вы не знаете много оNHibernate.

РЕДАКТИРОВАТЬ: И, как упоминалось в jgauffin, вы также можете переопределить OnResultExecuted в вашем контроллере.

0 голосов
/ 16 марта 2012

Длинный пост, но я делаю что-то вроде: -

В моем global.asax.cs

public static ISessionFactory SessionFactory { get; set; }

, а затем определить в запуске приложения

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);

    var nhConfig = new Configuration().Configure();
    SessionFactory = nhConfig.BuildSessionFactory();
}

Этот класс затем создается: -

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class NHSession : ActionFilterAttribute
{
    public NHSession()
    {
        Order = 100;
    }

    protected ISessionFactory sessionFactory
    {
        get
        {
                return MvcApplication.SessionFactory;
        }
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var session = sessionFactory.OpenSession();
        CurrentSessionContext.Bind(session);
        session.BeginTransaction();
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        var session = CurrentSessionContext.Unbind(sessionFactory);
        if (session != null)
        {
            if (session.Transaction.IsActive)
            {
                try
                {
                    session.Transaction.Commit();
                }
                catch
                {
                    session.Transaction.Rollback();
                }
            }
            session.Close();
        }
    }
}

Тогда мой общий репозиторий выглядит примерно так: -

public class Repository<T> : IRepository<T>
{
    private readonly ISessionFactory SessionFactory;
    public Repository(ISessionFactory sessionFactory)
    {
        SessionFactory = sessionFactory;
    }
    public ISession Session
    {
        get
        {
            return SessionFactory.GetCurrentSession();
        }
    }
    public T Get(long id)
    {
        return Session.Get<T>(id);
    }
}

Моя конкретная реализация хранилища: -

public class CmsContentRepository : Repository<CmsContent>, ICmsContentRepository
{
    public CmsContentRepository(ISessionFactory sessionFactory) : base(sessionFactory) { }
}

И еще одна вещь, которую я тогда украшаю своими контроллерами так: -

[NHSession]
public ViewResult Revisions(int id)
{
    var model = Service.CmsContentRepository.Get(id);
    return View("Revisions", model);
}

Это дает мне возможность использовать единицу работы в запросе. В основном, запрос приходит и запускает сессию, сессионная фабрика передается в ctor репозитория (ов) ... Я здесь использую DI, но это необязательно. Если обнаружена ошибка, то сеанс откатывается, если нет, он фиксируется в конце запроса. Я бы порекомендовал NHProf, так как он поможет вам разобраться с управлением сеансами (то есть, если он настроен неправильно).

0 голосов
/ 16 марта 2012

Контролировать вашу сессию NHibernate не входит в ваши обязанности контроллера. В идеале это должен быть ваш репозиторий или / и ваш IoCContainer при утилизации вашего репозитория. Как и в ответе выше, я не знаю много о NHibernate, но я бы следовал такой схеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...