Constructor Dependency Injection WebApi Attribute
Bin ich auf der Suche rund um für eine nicht-Parameter-injection-option für die WebApi Attribute.
Meine Frage ist einfach, ob dies überhaupt möglich ist, mit Structuremap?
Habe ich schon googeln um, aber kommen immer mit entweder Eigentum injection (die ich lieber nicht verwenden) oder soll Implementierungen von Konstruktor-Injektion, die ich bisher nicht in der Lage zu replizieren.
Mein container der Wahl ist Structuremap aber irgendein Beispiel, dies wird genügen, wie ich in der Lage bin, es zu konvertieren.
Schon mal jemand geschafft?
InformationsquelleAutor Morn | 2015-02-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist möglich. Sie (wie die meisten) geworfen werden von der Microsoft-marketing-Aktion Filter-Attribute, die bequem in einer einzigen Klasse, aber nicht bei allen DI-freundlich.
Die Lösung ist, brechen Sie die Aktion Filter-Attribut in 2 Teile wie gezeigt, in diesem post:
Den Ansatz ist die Verwendung der IActionFilter zum test auf das Vorhandensein des Attributs, und führen Sie dann das gewünschte Verhalten. Die Aktion filter können geliefert werden mit allen Abhängigkeiten (über den Konstruktor) und dann eingespritzt, wenn die Anwendung aus.
Draht mit StructureMap, werden Sie brauchen, um wieder eine Instanz der container aus Ihrer DI-Konfiguration Modul. Der Application_Start-Methode ist noch immer Teil der Komposition root, so können Sie die container überall innerhalb dieser Methode und es ist immer noch nicht als service-locator-Muster. Beachten Sie, dass ich nicht eine komplette WebApi setup hier, denn ich gehe davon aus, dass Sie bereits eine funktionierende DI-Konfiguration mit WebApi. Wenn Sie einen brauchen, das ist eine andere Frage.
Die Umsetzung der MaxLengthActionFilter würde wie folgt Aussehen:
Und Ihr Attribut , die nicht enthalten alle Verhalten sollte in etwa so Aussehen:
Ich habe implementiert eine test-basierend auf den oben genannten und den link, den Sie zur Verfügung gestellt. Ich bin immer noch kämpfen, um zu sehen, wie ich können dies nutzen, um Structuremap automatisch injizieren Sie die Konstruktor-Argumente. Im wesentlichen werden Sie newing eine Instanz des filter und hinzufügen. Sagen Sie, dass dies ist die nächstgelegene können wir bekommen??
Hier ist ein Beispiel, wo ich gelernt habe, in Bezug auf DI. Dies geschieht in der WebApiConfig aber verlangt von mir aufrufen über die GetInstance aufrufen.
var filter = new StringToLowerFilter(WebApiApplication.Container.GetInstance<IStringService>()); config.Filters.Add(filter);
StrucureMap wird automatisch beheben Sie die Konstruktor-injiziert Abhängigkeiten der filter. Sie müssen nur eindeutig zu identifizieren, Ihre filter in StructureMap, so dass Sie es lösen können. Sie können tun, dass eine benannte Instanz verwenden, aber es ist sauberer, nur um zu geben dem filter einen einzigartigen Abstraktion oder geben Sie den konkreten Typ explizit in der
GetInstance
Methode.Macht Sinn. Für jemand anderes dies Lesen, der oben funktioniert perfekt. Cheers.
InformationsquelleAutor NightOwl888
Kämpfte ich mit custom action-filter-Anbieter, ohne es an die Arbeit für meine auth-Attribute. Ich habe auch versucht, verschiedene Ansätze mit Konstruktor-und property-injection, aber nicht eine Lösung finden, dass fühlte sich gut an.
Ich landete schließlich Injektion Funktionen in meine Attribute. So können unit-tests injizieren eine Funktion zurückgibt, die eine fake oder mock, während die Anwendung gelingen kann, eine Funktion, löst die Abhängigkeit mit dem IoC container.
Schrieb ich über diesen Ansatz hier: http://danielsaidi.com/blog/2015/09/11/asp-net-and-webapi-attributes-with-structuremap
Es funktioniert wirklich gut in meinem Projekt und löst alle Probleme hatte ich mit der anderen Ansätze.
FYI - ich Las deinen Beitrag und bemerkt, dass Sie erwähnt Sie nicht bekommen konnte authorization-Filter für die Arbeit mit dependency injection. Es ist ein Beispiel, das zu tun, in dieser Antwort.
InformationsquelleAutor Daniel Saidi