2013-07-28 11 views
11

Ich habe ein paar Fragen dazu gefunden, aber sie neigen dazu, auf die genaue Dokumentation zu verweisen, die ich befolge ... aber es funktioniert immer noch nicht.Autofac-Attribut-Injektion fehlgeschlagen auf Attribute

Ich baue eine ziemlich einfache ASP.NET MVC 4-Site, und der Plan ist, ActionFilterAttribute-basierte Protokollierung zu verwenden. Ich habe eine DataAccessProvider Klasse, die Transaktionen mit der Datenbank öffnet und Unit-of-Work-Instanzen bereitstellt, und ich versuche, sie in das Filterattribut zu injizieren.

Die documentation besagt, dass es genügt, nur RegisterFilterProvider() zu rufen, und sicherzustellen, dass die relevanten Typen registriert sind. Es besagt ausdrücklich, dass das Attribut nicht registriert werden muss, aber ich habe beides mit und ohne versucht. Mein Code sieht derzeit so etwas wie folgt aus:

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)); 

Das Beispiel in der Dokumentation legt dann nur eine Eigenschaft auf dem Filter, also habe ich das gleiche getan:

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

    public override void OnActionExecuting(ActionExecutingContext filterContext) { ... } 
    public override void OnActionExecuted(ActionExecutedContext filterContext) { ... } 
} 

Die docs sagen, das ist alles erforderlich - nicht einmal ein Konstruktor in injizieren; Es ist durch Immobilieneinspritzung getan. Wenn ich diesen Code jedoch ausführen, ist die DataAccess Eigenschaft immer null; Autofac scheint es zu ignorieren. Ich weiß, dass die Registrierung richtig funktioniert, weil es EntityAccessProvider korrekt in meine Controller einspeist, aber es funktioniert nicht für Attribute. Was vermisse ich?

Antwort

13

Ihre Immobilie vom Typ IDataAccessProvider muss public für die Injektion zu arbeiten sein. Sie können immer noch DebugLogAttribute, IDataAccessProvider und seine Implementierung als intern markieren, wenn Sie bevorzugen.

[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

Hoppla ... total vermisst, dass. Vielen Dank! – anaximander

+0

Vielen Dank für Ihre Lösung :) – Redplane

Verwandte Themen