Ho un'app legacy Web.Forms che è stata parzialmente riscritta su MVC. La parte MVC utilizza autofac come contenitore di iniezione delle dipendenze.Autofac, MVC (con ActionFilters), Web.Forms - conflitto di risoluzione delle dipendenze
MVC parte hanno filtro personalizzato definito:
public class CustomActionFilter : ActionFilterAttribute
{
protected ILogger Logger { get; set; }
public CustomActionFilter(ILogger logger) { Logger = logger; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Logger.Log("OnActionExecuting");
}
}
Funziona bene quando l'integrazione Web.Forms è disattivato nel web.config. Hovewer, quando provo a utilizzare l'integrazione autofac di Web.Forms, ho ottenuto l'eccezione NullReferenceException relativa a AutofacFilterProvider
da qualche parte negli interni di autofac (stack trace).
- Global.asax.cs: http://pastebin.com/437Tnp0t
- web.config: http://pastebin.com/5pU6SH6c
noti che CustomActionFilter
è registrato come filtro globale, quindi è iscritto su autofac:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(DependencyResolver.Current.GetService<CustomActionFilter>());
}
}
Ho provato:
- utilizzando contenitori separati per MVC e Web.Forms - stesso risultato
- l'iniezione di proprietà invece di constructor - stesso risultato
- esplicitamente innescare risoluzione dipendenze sulle pagine web.forms (come this) - ha lavorato
Quindi, la domanda è: esiste un modo per fornire una risoluzione delle dipendenze dietro le quinte sia per la parte MVC che per quella web.forms. Sono nuovo di autofac e in qualche modo nuovo per i contenitori di iniezione di dipendenza in generale, quindi potrei semplicemente perdere qualcosa di ovvio.
Aggiornamento: errore non ha nulla a che fare con i filtri personalizzati. Se rimuovo tutti i riferimenti ai filtri personalizzati, il comportamento degli errori è sempre lo stesso, anche la traccia dello stack.
che cosa succede se si commento la 'ContainerDisposalModule' e dopo che si riattivare' 'PropertyInjectionModule' e AttributedInjectionModule'? Il 'ContainerDisposalModule' non dovrebbe essere necessario perché Autofac.MVC include un nuovo' RequestLifetimeHttpModule' che dispone il Lifetimscope creato durante la richiesta ... – nemesv
@nemesv stesso risultato. – J0HN
OK, vedo ora qual è il problema ... avrete servizi registrati con 'InstancePerHttpRequest'? – nemesv