Voor een recente opdracht heb ik een Database First REST API moeten ontwikkelen die alle entiteiten middels een simpel GET endpoint beschikbaar moest stellen. De database bevat zo’n 60 tabellen, en de exacte selectie aan tabellen kon pas later worden vastgesteld. Daarom heb ik ervoor gekozen om de API generiek op te stellen, waarbij de endpoints gegenereerd worden met behulp van de Fluent API op basis van de database scaffold. In deze blog lees je in de hoofdlijnen welke stappen ik heb ondernomen tijdens de realisatie van de API.
1. De database scaffold
Met behulp van Microsoft documentatie heb ik een herbruikbaar scaffold commando geschreven. Dit commando genereert de DbContext en alle entiteiten op basis van een connectie string. Doormiddel van het -Force attribuut kan dit commando meerdere malen worden uitgevoerd waarbij beide onderdelen volledig worden overschreven. In mijn geval was dit noodzakelijk omdat tijdens de ontwikkeling de tabellen nog niet definitief waren.
2. Maak een generieke controller aan
Maak een controller bestand met een enkele GET actie. De controller maakt uiteraard gebruik van generics. Het generic type is van type class en staat voor de entiteit uit de scaffold. Mijn controller ziet er als volgt uit:
3. Genereer een endpoint per classe
Nu de stap om per gewenste entiteit een endpoint te laten genereren. Dit kan met behulp van de Fluent API. In de onderstaande snippet bepaal ik de assembly, en welke types ik wil gebruiken uit de assembly. Vervolgens wordt er per type een endpoint aangemaakt. In stap 5 wordt deze code toegepast.
4. Definieer de route conventie
Ook is het gewenst om de route conventie te definiëren. De onderstaande code zorgt er voor dat de endpoints de route hebben met de naam van de entiteit, dus voor een entiteit genaamd ‘Item’ wordt de route ‘GET /Items’. Het if-statement zorgt ervoor dat dit alleen effect heeft op de generieke controller, zodat dit geen invloed heeft op eventuele andere controllers.
5. Breid de configuratie uit
Nu in het noodzakelijk om in je Startup.cs de configuraties uit stap 3 en 4 toe te passen.
Bij het opstarten van de applicatie zal nu per entiteit uit stap 3 een endpoint beschikbaar zijn met de route opgegeven in stap 4. Het aanroepen van het endpoint zal nu simpelweg de complete inhoud van de tabel teruggeven zoals geïmplementeerd in stap 2. De controller uit stap 2 kan uiteraard verder worden uitgebreid, zolang dit werkend is met generics.
Meer weten over onze oplossingen?
Onze consultants hebben veel ervaring binnen een grote verscheidenheid aan branches.
Eens verder brainstormen over de mogelijkheden voor jouw organisatie?
Maak kennis met onze specialist Arnoud van der Heiden.