ASP.NET MVC 3, фильтры действий и внедрение зависимостей Autofac

В ASP.NET MVC 2 у меня есть ActionFilterAttribute с именем [Transaction] , который запускает транзакцию NHibernate перед выполнением действия и фиксирует или откатывает ее. впоследствии, в зависимости от того, было ли создано исключение. Экземпляр ISession - это HttpRequestScoped () , внедренный Autofac . Это выглядит так и отлично работает:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public sealed class TransactionAttribute : ActionFilterAttribute
{
    private ITransaction transaction;

    public TransactionAttribute()
    {
        this.Order = 0;
    }

    public ISession Session
    {
        get;
        set;
    }

    public override void OnActionExecuted(
        ActionExecutedContext filterContext)
    {
        if (this.Session != null && this.transaction != null)
        {
            try
            {
                if (this.transaction.IsActive)
                {
                    if (filterContext.Exception == null)
                    {
                        this.transaction.Commit();
                    }
                    else
                    {
                        this.transaction.Rollback();
                    }
                }
            }
            finally
            {
                this.transaction.Dispose();
                this.transaction = null;
            }
        }
    }

    public override void OnActionExecuting(
        ActionExecutingContext filterContext)
    {
        if (this.Session != null)
        {
            this.transaction = this.Session.BeginTransaction();
        }
    }
}

Фантастика. Похоже, это обычный шаблон.

В примечаниях ASP.NET MVC 3 я вижу эту небольшую аннотацию в разделе «Критические изменения» (выделено мной):

В предыдущих версиях ASP.NET MVC, фильтры действий были созданы для каждого запроса , за исключением нескольких случаев. Такое поведение никогда не было гарантированным, а было просто деталью реализации, и контракт для фильтров заключался в том, чтобы рассматривать их без состояния. В ASP.NET MVC 3 фильтры кэшируются более агрессивно . Следовательно, любые фильтры настраиваемых действий, которые неправильно сохраняют состояние экземпляра, могут быть нарушены.

Ой.

  • Означает ли это, что я перейду на MVC 3?
  • Если фильтры действий больше не создаются для каждого запроса, как мы получим зависимости на уровне запроса в наши фильтры действий?

Спасибо за любую информацию.

6
задан Nicholas Piasecki 14 January 2011 в 21:01
поделиться