Обработка исключений фильтра транзакций ASP.NET MVC - PullRequest
1 голос
/ 03 февраля 2010

Я использую S # arp Architecture для проекта, который поставляется с атрибутом [Transaction] для методов Controller. При этом фиксация транзакции вызывается как фильтр OnActionExecuted, то есть происходит после выхода из области действия метода Controller. Моя проблема в том, что происходит, когда возникает исключение во время фиксации?

Из исходного кода S # arp вы можете увидеть следующий код в TransactionAttribute.cs

public override void OnActionExecuted(ActionExecutedContext filterContext) {
        string effectiveFactoryKey = GetEffectiveFactoryKey();

        ITransaction currentTransaction = 
            NHibernateSession.CurrentFor(effectiveFactoryKey).Transaction;

        if (currentTransaction.IsActive) {
            if (filterContext.Exception == null) {
                currentTransaction.Commit();
            }
            else {
                currentTransaction.Rollback();
            }
        }
    }

Например, если пользователь попытался выполнить сохранение в том месте, где имелось ограничение внешнего ключа (и имелись неправильные данные), то при фиксации будет создано исключение базы данных, которое не обрабатывается. Вместо того, чтобы выгружать пользователя на общую страницу ошибок (а именно, конструкцию [HandleError]), я бы предпочел вернуть их прямо туда, где они были, чтобы они могли исправить проблему. Я мог бы сделать это, если я сделаю транзакцию явно в рамках метода Controller. Я не могу, так как пост-фильтр, это выходит за рамки.

Я бы хотел посмотреть, что другие будут делать в этой ситуации.

...