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?
Hoppla ... total vermisst, dass. Vielen Dank! – anaximander
Vielen Dank für Ihre Lösung :) – Redplane