ASP.NET MVC 3, фильтры действий и внедрение зависимостей Autofac - PullRequest
6 голосов
/ 15 января 2011

Вкл. 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?
  • Если фильтры действий больше не создаются для каждого запроса, как мы получим зависимости от запросов в наших фильтрах действий?

Спасибо за понимание.

Ответы [ 2 ]

6 голосов
/ 04 февраля 2011

Я только что задал похожий вопрос на форумах Google. Вот ссылка https://groups.google.com/forum/#!topic/autofac/a0qqp2b3WA8

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

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


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

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

2 голосов
/ 18 января 2011

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

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

...