Immer eine Idee voraus

Tipps&Tricks: ASP.NET Core Controller in drei Zeilen

(11.04.2022)

ASP.NET Core Controller in drei Zeilen

Die ganze Arbeit neue Controller anzulegen auf drei Zeilen zu reduzieren klingt gut, aber unrealistisch? Wie immer ist etwas Vorarbeit notwendig, um das Ziel zu erreichen. Nehmen Sie sich kurz Zeit. Es wird sich lohnen.

Ausgangslage

Für unsere Projekte nutzen wir oft das CQS-Muster. Für die Kommandos und Abfragen, im Weiteren Funktionen genannt, haben wir entsprechende Schnittstellen in unserem idee5.Common – Paket definiert.

Für Abfragen:
Für Kommandos:

Damit andere Microservices die Funktionen aufrufen können, werden API-Controller erstellt. Diese sind kurz und einfach gehalten. Der Code kann kopiert und angepasst werden. Das wird aber schnell unübersichtlich, fehleranfällig und wartungsintensiv, wenn Funktionen entfernt oder hinzugefügt werden.

Wie jeder Entwickler, frage ich mich spätestens bei der dritten Wiederholung, wie das verbessert werden kann.


Erster Verbesserungsansatz

Als Erstes fällt einem der Einsatz generischer Controller ein. Damit entfällt das Schreiben des Codes für die einzelnen Endpunkte. Man muss nur einen Controller von diesem generischen Controller ableiten und den Konstruktor anpassen.

Das funktioniert schon sehr gut. Haben wir auch in unseren frühen MVC5-Projekten so gemacht.

Code-Schnipsel für einen CRUD-Controller aus einem alten Projekt:

Irgendwann stellt sich jedoch die Frage, warum man so viele Code-Dateien im Projekt hat und wie man die los wird.


Nächster Schritt der Verbesserung

Gräbt man etwas tiefer, findet man die Möglichkeit Controller zur Laufzeit zu registrieren. In ASP.NET Core wird dafür ein Application-Feature-Provider benötigt.

Damit der Provider die Controller dynamisch erzeugen kann, wird wieder ein generischer Controller definiert.

Der Provider sucht nach Funktions-Handlern und erzeugt die Controller auf Basis unseres generischen Controllers.

Die Controller können jetzt erzeugt werden, haben aber Namen, die von generischen Controller abgeleitet sind. Was noch wenig hilfreich ist. Die Namen passen wir über eine Controller-Model-Convention an.

Jetzt haben unsere Controller vernünftige Namen. Diese können wir ASP.NET Core guten Gewissens mitteilen. Damit das bei der Konfiguration übersichtlich bleibt haben wir zwei Erweiterungs-Methoden geschrieben.

Beim Start der Webanwendung kommen wir jetzt mit den versprochenen drei Zeilen aus und haben alle unsere Funktions-Handler als API-Endpunkte definiert.

Der vollständige Code ist inzwischen in einer Bibliothek auf GitHub zusammengefasst.