Ich versuche, einen generischen Controller wie folgt zu erstellen:
%Vor%
Ich beabsichtige, dass die URI-Segmentvariable {orderType} den generischen Typ des Controllers steuert. Ich experimentiere mit einem benutzerdefinierten IControllerFactory
und IControllerActivator
, aber nichts funktioniert. Jedes Mal, wenn ich versuche, eine Anfrage zu senden, erhalte ich eine 404-Antwort. Der Code für meine benutzerdefinierte Controller-Factory (und den Aktivator) wird nie ausgeführt.
Offensichtlich besteht das Problem darin, dass ASP.NET Core erwartet, dass gültige Controller mit dem Suffix "Controller" enden, aber mein generischer Controller hat stattdessen das (reflektionsbasierte) Suffix "Controller1". Daher bleiben die von ihm deklarierten attributbasierten Routen unbemerkt.
In ASP.NET MVC war % ce_de% zumindest in den frühen Tagen für das Entdecken verantwortlich alle verfügbaren Controller . Es wurde auf das Suffix "Controller" getestet:
Das MVC-Framework stellt eine Standard-Controller-Factory (passenderweise namens DefaultControllerFactory) zur Verfügung, die alle Assemblys in einer App-Domäne nach allen Typen durchsucht, die IController implementieren und deren Name mit "Controller" endet.
Offenbar hat die Controller Factory in ASP.NET Core diese Verantwortung nicht mehr. Wie bereits erwähnt, wird meine benutzerdefinierte Controller-Factory für "normale" Controller ausgeführt, aber nie für generische Controller aufgerufen. Es gibt also noch etwas anderes im Evaluierungsprozess, das die Entdeckung von Controllern regelt.
Weiß jemand, welche "Service" -Schnittstelle für diese Entdeckung verantwortlich ist? Ich kenne die Anpassungsschnittstelle oder den "Haken" -Punkt nicht.
Und weiß jemand von einer Möglichkeit, ASP.NET Core die Namen aller gefundenen Controller "dump" zu machen? Es wäre großartig, einen Komponententest zu schreiben, der überprüft, ob eine benutzerdefinierte Controller-Erkennung, die ich erwarte, tatsächlich funktioniert.
Wenn übrigens ein "Hook" vorhanden ist, der es erlaubt, generische Controller-Namen zu entdecken, bedeutet dies, dass Routensubstitutionen ebenfalls normalisiert werden müssen:
%Vor%
Unabhängig davon, welcher Wert für DefaultControllerFactory
angegeben ist, der Name des [controller] muss ein einfacher Basis-generischer Name bleiben. Unter Verwendung des obigen Codes als Beispiel wäre der [Controller] -Wert "Aufträge". Es wäre nicht "Orders'1" oder "OrdersOfSomething".
Hinweis
Dieses Problem könnte auch dadurch gelöst werden, dass die generischen Typen mit geschlossenem Typ explizit deklariert werden, anstatt sie zur Laufzeit zu generieren:
%Vor%
Das obige funktioniert, aber es erzeugt URI-Pfade, die ich nicht mag:
%Vor%
Was ich eigentlich wollte, war das:
%Vor%
Eine weitere Anpassung bringt mir die URIs, nach denen ich suche:
%Vor%
Obwohl dies scheint zu funktionieren, beantwortet es meine Frage nicht wirklich. Ich möchte meinen generischen Controller direkt zur Laufzeit verwenden und nicht indirekt (über manuelle Codierung) zur Kompilierungszeit. Im Grunde bedeutet dies, dass ich ASP.NET Core brauche, um meinen generischen Controller "sehen" oder "entdecken" zu können, obwohl sein Laufzeit-Reflektionsname nicht mit dem erwarteten "Controller" -Suffix endet.