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