Теперь я должен просмотреть свой код 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. Вот ссылка