Когда совершать транзакции NHibernate и отправлять электронную почту в приложении ASP.NET MVC 2? - PullRequest
0 голосов
/ 04 февраля 2011

Аналогично предыдущий вопрос Я борюсь с фиксацией транзакций и обработкой исключений.Однако, в отличие от решения, представленного там, я хотел бы решить его с помощью actionfilter.В настоящее время у меня есть код в ActionFilter, который выглядит следующим образом:

public override void OnResultExecuted(ResultExecutedContext filterContext)
{
        base.OnResultExecuted(filterContext);

        // Errors == ROLLBACK UoW
        // No Errors == COMMIT UoW
        if (UnitOfWork != null)
        {
            if (filterContext.Exception == null || filterContext.ExceptionHandled == true)
            {
                try
                {
                    UnitOfWork.Commit();
                    log.Debug("Transaction committed");
                }
                catch (Exception e)
                {
                    UnitOfWork.Rollback();
                    log.Error("Transaction rolled back: " + e.Message + (e.InnerException != null ? "" : "; " + e.InnerException.Message), e);
                }
            }
            else
            {
                UnitOfWork.Rollback();
                log.Warn("Transaction rolled back: " + filterContext.Exception.Message + (filterContext.Exception.InnerException == null ? "" : "; " + filterContext.Exception.InnerException.Message), filterContext.Exception);
            }
        }

    }

Это в основном работает.Однако, когда возникает исключение, я не могу сообщить пользователю об откате.Также было бы правильно сделать коммит в OnResultExecuting?Как я могу сообщить пользователю, что откат сделан?Во-вторых, при успешной фиксации иногда необходимо отправлять электронные письма.Как я могу получить список писем для отправки в ActionFilter?

1 Ответ

0 голосов
/ 10 февраля 2011

Попробуйте:

public override void OnResultExecuted(ResultExecutedContext filterContext)
{
    base.OnResultExecuted(filterContext);
    bool success = true;

    // Errors == ROLLBACK UoW
    // No Errors == COMMIT UoW
    if (UnitOfWork != null)
    {
        if (filterContext.Exception == null || filterContext.ExceptionHandled == true)
        {
            try
            {
                UnitOfWork.Commit();
                log.Debug("Transaction committed");
            }
            catch (Exception e)
            {
                UnitOfWork.Rollback();
                log.Error("Transaction rolled back: " + e.Message + (e.InnerException != null ? "" : "; " + e.InnerException.Message), e);
                success = false;
            }
        }
        else
        {
            UnitOfWork.Rollback();
            log.Warn("Transaction rolled back: " + filterContext.Exception.Message + (filterContext.Exception.InnerException == null ? "" : "; " + filterContext.Exception.InnerException.Message), filterContext.Exception);
            success = false;
        }
    }

    if (!success)
    {
        // Send Email notifying the user of the problem.
    }

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