Теперь я должен просмотреть свой код MVC 3 и посмотреть, нет ли у меня подобных проблем!

P.NET MVC 2 у меня есть называетсяActionFilterAttribute которая запускает транзакцию NHibernate перед выполнением действия, а затем фиксирует или откатывает ее в зависимости от того, было ли выброшено исключение.[Transaction] пример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 примечания, я вижу эту маленькую рекламу в разделе "Breaking Changes" (выделение мое):В предыдущих версиях ASP.NET MVC,

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

Означает ли это, что я нахожусь под ногами, если я обновлюсь до MVC 3?

Если фильтры действий больше не создаются для каждого запроса, как мы получим зависимости в области запросов в наших фильтрах действий?Спасибо за понимание.

Я только что задал похожий вопрос на форумах Google. Вот ссылка

Ответы на вопрос(1)

Решение Вопроса

Я получил ответ:

Затем вы можете использовать внедрение свойств в ваших атрибутах.

builder.RegisterType<ExtensibleActionInvoker>().As<IActionInvoker>();


builder.RegisterControllers(Assembly.GetExecutingAssembly()).InjectActionInvoker();

Да, похоже, что примечание к выпуску относится к настройке по умолчанию в MVC - но контейнеры IoC переопределяют это, чтобы обеспечить свое поведение.

 Nicholas Piasecki05 февр. 2011 г., 00:46
О, черт ... Николас, вам может потребоваться сохранить ISession и Transaction в HttpContext.Items, к которым вы сможете получить доступ через ActionExecutedContext / ActionExecutingContext (возможно, установив его в обработчике события OnActionExecuting), вместо того, чтобы хранить их в экземплярах членов. Либо так, либо вы можете вызвать ServiceLocator внутри вашего фильтра, чтобы захватить их для вас (тоже хм).

Ваш ответ на вопрос