ASP.net MVC 3, filtros de ação e injeção de dependência de autofac
EmASP.NET MVC 2 eu tenho umActionFilterAttribute
chamado[Transaction]
que inicia uma transação NHibernate antes de executar a ação e a confirma ou reverte depois, dependendo se uma exceção foi lançada ou não. oISession
instância éHttpRequestScoped()
e injetado porAutofac. Parece assim e funciona muito bem:
[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();
}
}
}
Fantástico.Parece ser um padrão comum.
NoASP.NET MVC 3 observa, vejo essa pequena sinopse em "Breaking Changes" (ênfase minha):
Nas versões anteriores do ASP.NET MVC,filtros de ação foram criados por solicitação exceto em alguns casos. Esse comportamento nunca foi um comportamento garantido, mas apenas um detalhe de implementação e o contrato para filtros deveria considerá-los sem estado. No ASP.NET MVC 3, os filtros sãoarmazenado em cache de forma mais agressiva. Portanto, qualquer filtro de ação personalizado que armazena incorretamente o estado da instância pode ser quebrado.
Opa
Isso significa que eu sou processado se atualizar para o MVC 3?Se os filtros de ação não forem mais instanciados por solicitação, como obteremos dependências com escopo de solicitação em nossos filtros de ação?Obrigado por qualquer insight.