Ho trovato alcune domande su questo argomento, ma tendono a puntare alla documentazione esatta che sto seguendo ... ma non funziona ancora.Iniezione attributo autofac non riuscito sugli attributi
Sto costruendo un sito ASP.NET MVC 4 abbastanza semplice, e il piano è quello di utilizzare la registrazione basata su ActionFilterAttribute
. Ho una classe DataAccessProvider
che apre le transazioni con il database e fornisce istanze unit-of-work, e sto provando a inserirle nell'attributo filtro.
Il documentation afferma che è sufficiente chiamare semplicemente RegisterFilterProvider()
e assicurarsi che i tipi pertinenti siano registrati. In particolare, afferma che non è necessario registrare l'attributo, ma ho provato sia con che senza. Il mio codice attualmente simile a questa:
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.Register(x => new EntityAccessProvider())
.As<IDataAccessProvider>()
.InstancePerHttpRequest();
builder.RegisterType<DebugLogAttribute>().PropertiesAutowired();
//^I've tried it with and without this line
builder.RegisterFilterProvider();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
L'esempio nella documentazione poi basta pone una proprietà sul filtro, così ho fatto lo stesso:
public class DebugLogAttribute : ActionFilterAttribute
{
private IDataAccessProvider DataAccess { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext) { ... }
public override void OnActionExecuted(ActionExecutedContext filterContext) { ... }
}
I documenti dicono che è tutto è richiesto - nemmeno un costruttore in cui iniettare; è fatto per iniezione di proprietà. Quando eseguo questo codice, tuttavia, la proprietà DataAccess
è sempre null
; Autofac sembra ignorarlo. So che la registrazione funziona correttamente perché sta iniettando correttamente EntityAccessProvider
nei miei controller, ma non funziona per gli attributi. Cosa mi manca?
Oops ... assolutamente mancato. Grazie! – anaximander
Grazie per la soluzione :) – Redplane