2013-07-28 11 views
11

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?

risposta

13

La vostra proprietà di tipo IDataAccessProvider deve essere pubblica per l'iniezione al lavoro. Puoi ancora contrassegnare DebugLogAttribute, IDataAccessProvider e la sua implementazione è interna se preferisci.

[DebugLogAttribute] 
public class HOmeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

internal class DebugLogAttribute : ActionFilterAttribute 
{ 
    public IDataAccessProvider DataAccess { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Debugger.Break(); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Debugger.Break(); 
    } 
} 

internal interface IDataAccessProvider {} 

internal class DataAccessProvider:IDataAccessProvider {} 
+0

Oops ... assolutamente mancato. Grazie! – anaximander

+0

Grazie per la soluzione :) – Redplane

Problemi correlati