Az Entity Framework laboron készült adatmodellt (kissé kibővítve) fogjuk hasznosítani, hogy egy RESTful API-t készítsünk ASP.NET Core-ban.
-
Hozz létre egy új C# nyelvű ASP.NET Core Web API (nem Web App!) típusú projektet
MovieCatalog.Api
néven- Érdemes a laborgépeken kikapcsolni a Configure for HTTPS lehetőséget, mert a gépekre nem biztos, hogy tudjuk telepíteni a fejlesztéshez szükséges tanúsítványt. Saját gépeken ilyen probléma nem lesz, viszont az első indításkor el kell fogadni a tanúsítvány telepítését a kettő megjelenő ablakban.
- .NET verzió: 6.0
- Minden extra opció legyen kikapcsolva, kivéve
- Use controllers
- Enable OpenAPI support - ezzel a műveleteink metaadata alapján generálódó Swagger UI tesztoldalt kapunk
- Authentication type is None legyen
-
Nem lesz szükség a létrejött projektben az alábbi fájlokra, ezek törölhetők:
Controllers/WeatherForecastController.cs
WeatherForecast.cs
-
Töltsd le az alábbi DACPAC fájlt innen. Ami egy hordozható export formátum MS SQL Server adatbázisok számára.
-
Csatlakozz egy LocalDB példányhoz a Visual Studio-s SQL Server Object Explorerben. Ezután a Databases mappán jobbklikk, majd válaszd Publish Data-tier Application opciót. Tallózd be a DACPAC fájlt és add meg adatbázis nevét, ami legyen a neptun kódod, majd mehet a Publish. Ezzel telepíted a DACPAC fájlban lévő objektumokat, adatokat az adatbázis kiszolgálóra. Import után érdemes ráfrissíteni az adatbázisok listájára.
-
Add hozzá a fejlesztésre szánt kapcsolódási stringet az appsettings.Development.json fájlhoz (az appsettings.json "mögött" bújik meg). A beállítás neve is legyen a neptun kódod (pontosabban DBneptunkód).
{ "ConnectionStrings": { "DB<neptun kódra írj át>": "Server=(localdb)\\mssqllocaldb;Database=<neptun kódra írj át>;Trusted_Connection=True;MultipleActiveResultSets=true" }, "Logging": { ... } }
- Ha már korábbról van ugyanilyen névvel adatbázisunk, azt érdemes törölni, vagy más néven elnevezni a connection stringben az adatbázist, hogy ne akadjanak össze.
-
Add hozzá a projekthez a Microsoft.EntityFrameworkCore.SqlServer NuGet csomagot
-
Add hozzá az előre elkészített entitásmodell és adatbázis kontextus fájlokat a projektedhez egy új Entities könyvtárba. Ehhez érdemes letölteni ezt a git repot. A DACPAC adatbázis sémája megfelel az EF modellnek, és mivel nem módosítunk rajta, így EF migrációval ezen mérés keretében nem kell foglalkozni.
-
Regisztráld az adatbázis kontextust a DI rendszerbe. (Program.cs)
-
Add hozzá a projekthez az előkészített kivétel osztályokat innen egy új Exceptions mappába.
-
Add hozzá a projekthez az előkészített
GenreService
és azIGenreService
osztályokat innen egy új Services mappába. -
Regisztráld az
IGenreService
-t a DI rendszerbe scoped életciklussal. (Program.cs)
- A kontroller nem használhatja adatbáziselérésre a kontextust, csak a Services mappában található IXXXService interfész műveleteit, közvetetten pedig a XXXService függvényeit.
- A kontroller közvetlenül nem példányosíthatja a XXXService-t, csak konstruktoron keresztül kaphatja IXXXService-ként
- A kontroller függvényei (azaz a műveletek) minden esetben
- aszinkronok (
async
), de a nevüknek nem kellAsync
-ra végződni Task<ActionResult>
vagyTask<ActionResult<T>>
visszatérési értékűek, ahol aT
kollekció is lehet
- aszinkronok (
- A XXXService osztályok a különleges eseteket (unhappy path) kivételdobással jelzik a hívó felé. A szükséges kivételtípusok már implementálva vannak a projektben, az Exceptions mappából másoltuk be őket.
- A XXXService osztályokban minden szükséges metódus váza megtalálható, de nem minden metódus van implementálva, a hiányzókat implementálnod kell legkésőbb a kapcsolódó feladat megoldásakor
Készíts egy új API kontrollert GenresController
néven! A kontroller az alábbi műveleteket tudja elvégezni:
GET /api/genres
- az összes műfaj lekérdezése,
- 200-as HTTP válaszkóddal tér vissza (Ok), a válasz törzsben a műfajok sorosított listájával
GET /api/genres/<ID>
- Az adatbázis sémája szinte megegyezik az EF laboron megismerttel, kivéve:
- új index a Title.StartYear oszlopra
- az új művek azonosítóját az adatbázis osztja ki
- az ezen órai modell pont a fentiek miatt nem kompatibilis az előző órai adatbázissal
- A XXXService osztályok a kivételes eseteket kivételdobással kezelik (pl. a megadott ID-val nem található elem
ObjectNotFoundException<>
dobást eredményez) - Kiinduló kontroller kódot lehet generáltatni. Ehhez a laborhoz az API controller with read/write actions generátor az ajánlott, az Entity Framework-ös generátorok gyakran hibára futnak és egyébként is körülbelül a generált kód ugyanannyi részét kellene átírni.
- Sokszor körülményesebb az IIS Express-en történő debuggolás, helyette használhatod közvetlenül a Kestrel szervert is. Ehhez a zöld play gomb melletti menüben a projekt nevét viselő lehetőséget válaszd ki! Ezután indításkor az IIS Express tálcaikon helyett egy konzolalkalmazás indul el, ami hasznos üzeneteket is kiír a konzolra.
- Régebbi .NET-en, vagy Open API/Swagger nélkül az F5 hatására a szerver elindul, automatikusan a /weatherforecast URL-re kerülünk. Mivel a szerverünknek nincsen felülete, a
WeatherForecastController
t pedig töröltük, ezért itt egy 404-es oldal fogad minket. Ez nem gond, de ha a kezdő URL-t szeretnéd átírni, akkor a projekten belül a Properties/launchSettings.json fájlban teheted meg (launchUrl
mező átírása vagy törlése). - Módosító/beszúró műveleteknél szükség van egy elemre sorosított formában, ezt kell általában ezen műveleteknél a törzsben küldeni. Érdemes ezt a sorosított formát a lekérdező művelet válaszából elcsenni.
- Általad írt kódrészletekről képernyőképet kell beadni. Ezek a fájlok érintettek:
- Program.cs
- kontrollerek kódfájljai
- XXXService-ek kódfájljai
- Minden feladathoz beadandók tesztkésekről készítendő képek. A képet a Swagger UI beépített weboldalról kell készíteni. A kép a Curl résztől a Server response-ig terjedő részt (a Responses részt már nem) tartalmazza (response header és response body is, ha van!). Példák:
- listázás
- egy elem sikeres lekérdezése
- nem létező elem lekérdezése
Folytasd a következő feladattal.