Ich möchte meinen MVC-Controllern einige übergreifende Bedenken machen. Im Moment wird dies durch eine abstrakte Basisklasse implementiert, aber da wir mehr von der Codebasis reformatieren, um die Abhängigkeitsinjektion zu nutzen, frage ich mich, ob Simple Injector mir durch seine Dekoration oder Abhörmöglichkeiten helfen kann .
Also habe ich versucht, einen ziemlich einfachen Dekorateur zu erstellen:
%Vor% Und in meiner Zusammensetzung root: container.RegisterDecorator<IController, ControllerDecorator>()
Der Code in der Execute
-Methode meines Dekorators scheint jedoch nie aufgerufen zu werden. Liegt es daran, dass das MVC-Framework meine Controller-Klassen direkt auflöst, anstatt IController
zu durchlaufen? Was kann ich in diesem Fall tun? Was fehlt mir hier?
In der Standardkonfiguration können Sie Dekoratoren nicht auf Controller anwenden. Der Grund hierfür ist, dass MVC DefaultControllerFactory
Controller nach ihrem konkreten Typ anfordert. Da Simple Injector einen konkreten Typ anfordert, kann Simple Injector keinen Decorator anwenden; es muss davon ausgegangen werden, dass der Aufrufer diesen konkreten Typ benötigt und daher diesen genauen Typ (oder einen Untertyp) zurückgeben muss.
Um das Problem zu beheben, müssen Sie den Standard DefaultControllerFactory
durch einen benutzerdefinierten ersetzen:
Als nächstes müssen Sie in Ihrem Bootstrapper den Aufruf von RegisterMvcControllers
durch Folgendes ersetzen:
Die Methode CreateControllerProducer
sieht folgendermaßen aus:
Entscheidend ist, dass der Aufruf von CreateProducer
mit typeof(IController)
; Dadurch kann der Simple Injector einen Dekorator für IController
anwenden.
Das ist es; Jetzt können Sie Ihren Dekorator für IController
registrieren.
Eine Warnung: Sowohl mit der Web-API als auch mit dem neuen ASP.NET-Core ist es unmöglich, Decorators auf Controller anzuwenden. Beide Frameworks erwarten konkrete Typen; Sie werden brechen, wenn Sie den echten Controller einpacken. Der bevorzugte Weg mit diesen Frameworks, Controller zu dekorieren, ist die OWIN-Pipeline. Diese Antwort funktioniert also nur mit MVC 3, 4 und 5.
Tags und Links asp.net-mvc simple-injector