NagyHF pontrendszer¶
Pontszerzési szabályok¶
- Egy jogcímen csak egyszer szerezhető pont (pl. nem lehet 3 külső osztálykönyvtárral 21 pontot összeszedni), kivéve ahol ezt külön jelezzük
- Részpontszám nem adható, kivéve, ahol intervallum van megadva
- Kliensoldali megoldásért nem adható pont
- A szoftvernek egységes funkcióhalmazt kell nyújtania, különálló, egymáshoz nem kapcsolódó funkciókból álló szoftver nem elfogadható. Azaz különálló tutorialok összefércelését nem díjazzuk.
Pontrendszer véglegesítés
Jelenleg a 2024. tavaszifélévre nincs véglegesítve a pontrendszer!
Véglegesítés után csak a következő típusú változások lehetnek
- hallgatóknak kedvező változások (pl. új jogcímek)
- elírások, megfogalmazásbeli pontosítások javítása
- ellentmondások feloldása
Társadalmi munka¶
- a véglegesített pontrendszer vagy jegyzet javítása, bővítése, módosítása pull request-tel [0-2, max. 5]
- Helyesírási hiba is lehet, de az oktatók döntenek, hogy hány pontot (0-2) ér a módosítás
- Többször is megszerezhető!
ASP.NET Core Web API¶
- HATEOAS linkek generálása a válaszban [7]
- Web API Core által alapból nem támogatott HTTP ige (verb) implementálása [5-7]
- pl. GET-hez hasonló működés 5
- pl. PATCH ige részleges módosításhoz JSON Patch dokumentumok felküldésével 7
- pl. OPTIONS ige az erőforrás által támogatott igék lekérdezéséhez 7
- verziókezelt API. Szemléltetés két különböző verziós API egyidejű kiszolgálásával. A kívánt verziót HTTP fejléc vagy például URL szegmens alapján választhatja meg a kliens. [7]
- cache megvalósítása [3-9]
- ETAG alapú: a kliens felüküld egy E-TAG-et, szerver összeveti az adatbázisból felolvasott verzióval 3
- a szerver is memória alapú cache-ből olvassa ki az aktuális verziót +3
- a szerver is elosztott alapú cache-ből olvassa ki az aktuális verziót pl.: Redis +
IDistributedCache
+3
- Szerver oldali autentikáció. Saját token provider készítése, használata (DIY security) esetén nem jár pont. [7-15]
- API (egy részének) védése felhasználó által igényelhető API kulccsal 7
- ASP.NET Core Identity beépített megoldásaival (süti alapú) - csak böngészős/Postman kliens esetén! 7
- OpenID Connect, JWT token alapú osztálykönyvtárat integrálva ASP.NET Core Identity + Duende IdentityServer / OpenIddict middleware-rel, interaktív flow
- angular, react kliens esetén 7
- Blazor WebAssembly kliens esetén 10
- egyéb kliens esetén 12
- Azure AD B2C-re (ingyenes szint) építve 10
- normál Azure AD (nem B2C) 7
- LDAP alapú szolgáltatásra építve 10
- más Identity-as-a-Service szolgáltatással (pl. Auth0) 7
- legalább egy külső identity provider integrálása (Google login, Windows login, stb.) +3
- szerver oldali hozzáférés-szabályozás, az előbbi authentikációra építve [2-5]
- szerepkör alapú hozzáférés-szabályozás 2
- policy alapú hozzáférés-szabályozás (pl.: Claim alapon) 5
- külső online szolgáltatás (Twitter, Facebook, Google Maps, Bing Maps, stb.) integrálása a szerveroldali alkalmazásba klienskönyvtárral (pl. HttpClient) vagy SDK-val [7-10]
- egyszerű REST API, SDK használat nélkül, egyszerű API kulcs alapú authentikáció 7
- SDK-val / REST API-val, authentikációt (pl. OIDC) végrehajtva 10
- SignalR Core alkalmazása valós idejű, szerver felől érkező push jellegű kommunikációra 7
- teljes szerveroldal hosztolása külső szolgáltatónál [5-15]
- Azure (ingyenes App Services - WebApp szolgáltatás) 7
- egyéb szolgáltató 5
- Automatizált telepítés (pl. GitHub Actions, Azure DevOps) +3
- Publikálás docker konténerbe és futtatás konténerből 5
- hosztolás service-ben (Windows Service, Linux systemd) [3-5]
- Windows service 3
- Linux systemd 5
- OpenAPI leíró (swagger) alapú dokumentáció [3-12]
- minden végpont kliens szempontjából releváns működése dokumentált, minden lehetséges válaszkóddal együtt 3
- az API-nak egyidejűleg több támogatott verziója van, mindegyik dokumentált és mindegyik támogatott verzió dokumentációja elérhető +4
- A kliensen az OpenApi leíró alapján generált klienskönyvtár használata +5
- Command-line generátor eszköz használata és konfigurálása +3
- Adatbázis entitás elsődleges kulcs elrejtése a kliens elől véletlenszerűen generált, nem növekvő sorrendben kiosztott kulcsokkal. A kliens nem ismeri az adatbázis entitás kulcs értékét, helyette egy generált kulcsot lát csak. Az adatbázis nem tárolja a generált kulcsot. Megvalósítható kétirányú szám <-> generált azonosító függvények segítségével. 7
- Központosított hibakezelés, a kliens számára értelmezhető
ProblemDetails
objektumok küldése hibás kérések esetén. Tehát nem a Controllerekben van try-catch, hanem a hibák központilag vannak kezelve 5 - Minden bejövő kliensről érkező adat validációja pl.: DataAnnotations, FluentValidation stb. használatával és
ValidationProblemDetails
-ként visszajelezve a kliens felé 5 - Dátumok helyes kezelése olyan esetben is, ha a kliens és a szerver(ek) eltérő időzónában vannak. (tipikusan
DateTimeOffset
használata). Implementációt nem kell bemutatáskör demonstrálni, de a kód alapján érvelve bizonyítani kell a helyes működést. 5
Kommunikáció, hálózatkezelés¶
- alacsony szintű kommunikáció (soros port, HTTP alatti OSI réteg, pl. kétirányú TCP) 10
- HTTPS kommunikáció (self-signed tanúsítvánnyal) az ASP.NET Web API és a kliens között, hosztolás normál, nem fejlesztői webszerverben (pl. Apache, nginx, nem IIS Express) és nem Kestrel-en, szemléltetés Fiddler-rel/Postman-nel [5-10]
- csak szerver oldali tanúsítvány 5
- kliens is azonosítja magát tanúsítvánnyal a szerver felé +5
- az API funkciók egy részének elérhetővé tétele GraphQL hívásokon keresztül, ASP.NET Core middleware segítségével (pl. GraphQL.NET vagy Hot Chocolate) az EF entitásmodellre építve. Szemléltetés példahívásokkal a kliensből. [7-10]
- csak lekérdezés 7
- módosítás vagy hozzáadás is (mutáció) +3
- az API funkciók egy részének elérhetővé tétele gRPC HTTP/2 vagy gRPC-Web hívásokon keresztül. Szemléltetés példahívásokkal kliensből vagy gRPC teszteszközből (pl. bloomrpc) Azure App Service-szel, IIS-sel, böngészős klienssel korlátozottan kompatibilis! [7]
- az EF adatmodell kiajánlása OData szolgáltatás segítségével (Microsoft.AspNetCore.OData csomag). Példahívás bemutatása a kliensből OData v4 protokollt használva. [7-10]
- csak lekérdezés 7
- módosítás vagy hozzáadás vagy törlés is +3
- Aszinkron kommunikáció használata üzenetsorral (pl.: RabbitMQ, Azure ServiceBus, Azure Queue Storage, AMQP, MQTT stb.) 7
Entity Framework Core¶
- leszármazási hierarchia leképezése Entity Framework-kel (legalább kétszintű, legalább 3 tagú hierarchia) [3-7]
- TPH, a diszkriminátor mező testreszabásával (saját mezőnév vagy saját értékek) 3
- TPT-vel 5
- TPC-vel 7
- MS SQL/Azure SQL/LocalDB-től eltérő adatbáziskiszolgáló használata EF Core-ral (kivéve még: sqlite) [10-12]
- Azure Cosmos DB (NoSQL!) 10
- egyéb, EF Core támogatott adatbázis 5
- saját Code-First konvenció készítése 5
- saját többesszámosító (
IPluralizer
) - nem kell nyelvtanilag helyesnek lennie [7] - automatikus újrapróbálkozás beállítása tranziens adatbázishibák (pl. connection timeout) ellen [2]
- Table splitting 5
- Entity splitting [5]
- alternatív kulcs [3-5]
- alternatív kulcs bevezetése valamelyik entitásban 3
- más entitás kapcsolattal hivatkozik az alternatív kulcsra +2
- adatbázis index konfigurációja az EF modellben [3]
- HiLo elsődleges kulcs alkalmazása [3]
- birtokolt típus (owned type) használata [3]
- adatbetöltés (seeding) migráció segítségével (
HasData
) [3] - értékkonverter (value converter) alkalmazása EF Core leképezésben [3-5]
- beépített, vagy külső komponensből származó value converter 3
- saját value converter 5
- térbeli (spatial) adatok kezelése EF Core és NetTopologySuite segítségével. Legalább egy spatial oszlop kezelése és legalább egy spatial művelet (pl.
Contains
) alkalmazása. Nem minden provider támogaja! [7] - időkezelt (temporal) táblák kezelése EF Core segítségével. Legalább egy időkezelt tábla használata és historikus adatának felhasználása. Csak SQL Server/LocalDB/Azure SQL provider támogatja! [7]
- Egyéb EF Core funkció használata, ami nincs a listában [3-10] Gyakorlatvezetővel előre egyeztetendő, hogy felkerüljön a listára.
.NET részfunkciók alkalmazása¶
- az EF Core működőképességét, az adatbázis elérhetőségét jelző health check végpont publikálása a Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore NuGet csomag használatával [3]
- kifejezésfa (ExpressionTree) értelmezése/készítése/módosítása az Expression API használatával [5-20]
- pl. szűrés dinamikusan, paraméterből érkező property neve alapján (pl.
o => o.Prop == propNev
) 5 - pl. keresés kapcsolódó kollekcióban dinamikusan (pl.
o => o.Coll.Any(e => e.Prop == propNev)
) 10 - saját LINQ provider - előzetes egyeztetés szükséges! 20
- pl. szűrés dinamikusan, paraméterből érkező property neve alapján (pl.
- explicit kölcsönös kizárás helyett ConcurretBag/ConcurrentQueue/ConcurrentStack/ConcurrentDictionary használata olyan rétegben, ahol párhuzamos hozzáférés valóban előfordul [5]
- lock-free algoritmus implementálása és használata (könyvtári implementáció felhasználása nélkül,
Interlocked
függvények használatával) [10] - automatizált (unit vagy integrációs) tesztek készítése [7-14]
- minimum 10 függvényhez/végponthoz 7
- a unit tesztekben a mock objektumok injektálása +3
- EF Core memória-adatbázis vagy sqlite (vagy in-memory sqlite) használata teszteléshez +4
- XML validálás, alkalmazkodás meglévő XML formátumhoz pl. publikus webes sémához (RSS, opml) [7]
- Optimista konkurenciakezelés [5-15]
- ütközésdetektálás és automatikus ütközésfeloldás 5
- ütközésfeloldás a felhasználó döntése alapján: client wins vagy store wins feloldással. Ütközés esetén a felhasználótól megkérdezzük, hogy a két adatverzió közül melyik legyen mentve az adatbázisba: az aktuális felhasználóé, a másik felhasználóé. Bemutatáskor szemléltetés egy példán keresztül. 10
- a felhasználó az eredeti értéket is választhatja (a módosítások előtti érték visszaállítása) +5
- pesszimista konkurenciakezelés (adatbázisobjektumok zárolása) bizonyos entitások/funkciók esetén, nem kell a teljes alkalmazásban alkalmazni. Bemutatáskor szemléltetés egy példán keresztül. [10]
- diagnosztika beépített vagy külső komponens segítségével [5-11]
- legalább két célba, amiből legalább egy perzisztens (pl. fájl vagy adatbázis vagy külső szolgáltatás) 5
- struktúrált naplózás (structured logging) +2
- fájl cél esetén rolling log (minden napon/héten/10 MB-onként új naplófájl) +2
- az egyik cél egy külső naplózó szolgáltatás (pl. Azure Application Insights) +2
- Paraméterezett nagy teljesítményű kódgenerált naplózás használata legalább 2 helyen. +2
- áthívás nem felügyelt környezetbe (pl. natív Win32, natív linux) [7-12]
- legalább egy nem egyszerű típus átadása/átvétele paraméterként 7
- saját natív kód használata, összetett típus átadásával 12
- külső komponens használata DTO-k inicializálására [3]
- Object mapper, pl. AutoMapper 3
- Explicit kódgeneráló, pl. MappingGenerator (ingyenes változat) 3
- logikai törlés (soft delete) megvalósítása. A logikailag törölt elemek alapértelmezésben nem lekérdezhetőek - ezen szűrés megvalósítása globális szűrőkkel (Global Query Filter) [5]
- háttérművelet(ek) megvalósítása [5-7]
IHostedService
/BackgroundService
használatával [5]- nem beépített, külső háttérfolyamat komponenssel, pl. Quartz.NET, Hangfire [7]
- nem nullozható referencia típusok (NRT) kényszerítése a nullable context bekapcsolásával minden szerveroldali projektre és minden nullable context sértés figyelmeztetés hibaként kezelése. Nullable context kikapcsolása projekten belül csak indokolt esetekben. [3]
- Entitás specifikus elsődleges kulcs típusok használata (
entityA.Id = entityB.Id
fordítási hiba, ha a két entiás típusa eltér). A kliens oldalon, illetve a kontroller függvények fejlécében (pl. bemenetként) nem kell, hogy megjelenjenek ezek a típusok, csak a kontroller rétegtől lefelé (EF szinten is). Segédkönyvtár. [10] - Szoftver funkcióinak ki/bekapcsolhatósága FeatureFlagek kezelésével [5-8] pl.: https://learn.microsoft.com/en-us/dotnet/architecture/cloud-native/feature-flags
- config alapú 5
- felhasználói felületről állítható +3
- Szerver oldalon előforduló szöveges erőforrások lokalizálása, amik a kliensre eljuthatnak (pl.: hibaüzenetek) [5]
Kiegészítő, kapcsolódó technológiák alkalmazása¶
- Rx.NET használata (dokumentáció) [7-10]
- néhány alap Rx operátor használata 7
- két külső adatforrás integrálása 10
- F# modul készítése és meghívása. Legalább az egyik legyen benne ezek közül: pattern matching, async, magasabb rendű függvény [7]
- külső osztálykönyvtár használata szerver oldalon. A külső komponens által megvalósított funkcionalitásért, képességért további pontszám nem adható. Nem számít ide a projekt generálásakor automatikusan bekerülő, illetve a Microsoft által készített, az alaptechnológiák függőségeit jelentő NuGet csomagok [7]
- platformfüggetlen kódbázisú szerveralkalmazás készítése és bemutatása legalább 2 operációs rendszeren az alábbiak közül: Windows, Linux, Mac, ARM alapú OS (pl. Raspberry Pi OS). Közvetlen futtatás fogadható csak el, pl. konténerből való futtatás nem (arra van külön jogcím). [3]
- NET Compiler platform (Roslyn) Diagnostic Analyzer [3-7]
- egyszerű analyzer, pl. property név konvenciók ellenőrzése 3
- bonyolultabb analyzer és kód fix is, pl. kiemelés metódusba 7
- CQRS és Mediátor tervezési minta használata a teljes alkalmazásban (MediatR) [5-11]
- Commandok és Queryk szétválasztása és lazán csatolása mediátorral 5
- Domain események használata +3
- MediatR behavior pipeline kiterjesztése +3