Hozd létre az alábbi interfészt a Data projektben:
usingMovieCatalog.Data.Entities;namespaceMovieCatalog.Data{publicinterfaceIMovieCatalogDataService{/// <summary>/// Az összes <see cref="Genre"/> lekérdezése név szerinti növekvő sorrendben./// </summary>/// <returns>Egy betöltött <see cref="Genre"/> kollekciót adó <see cref="Task{T}"/>, amiben a műfajok szerepelnek név szerinti növekvő sorrendben.</returns>Task<IEnumerable<Genre>>GetGenresAsync();/// <summary>/// <see cref="Title"/> lekérdezése ID alapján. Ha nem található, kivétel keletkezik./// Az eredmény objektumban a műfajok is szerepelnek, a műfajokban a hozzájuk tartozó további művek viszont nem./// </summary>/// <param name="id">A megtalálandó <see cref="Title"/> entitás.</param>/// <returns>A megtalált <see cref="Title"/> entitással visszatérő <see cref="Task{T}"/>, amiben a műfajok kollekciója is ki van töltve.</returns>Task<Title>GetTitleByIdAsync(intid);/// <summary>/// Egy olyan szótár lekérdezése, ami visszaadja, hogy melyik műfajban hány mű található. A kulcs a műfaj Id tulajdonsága./// </summary>/// <returns>Egy <see cref="Task{T}"/>, melynek aszinkron eredménye egy <see cref="IReadOnlyDictionary{T, T}"/> szótár, ambiben benne van, hogy melyik műfajban (Id szerint) hány mű található.</returns>Task<IReadOnlyDictionary<int,int>>GetTitleCountsByGenreIdAsync();/// <summary>/// Azon művek lekérdezése, amiknek az elsődleges címében szerepel a megadott szövegrész./// Maximum 10 eredmény érkezhet a lekérdezésre, és az eredmény objektumokban a hozzájuk tartozó műfajok is ki vannak töltve./// Kisbetű-nagybetű érzékenységgel nem foglalkozik./// </summary>/// <param name="namePart">A szövegrész, melyre szűrést végzünk.</param>/// <returns>Maximum 10 elemű <see cref="Title"/> halmazt visszaadó, betöltött <see cref="IEnumerable{T}"/> kollekciót reprezentáló <see cref="Task{T}"/>.</returns>Task<IEnumerable<Title>>GetTitlesByNameAsync(stringnamePart);}}
Implementáld az interfészt egy MovieCatalogDataService nevű osztályban, de a GetGenresAsync kivételével egyelőre csak dobjanak kivételt. A kivételt dobó metódusvázakat legeneráltathatod, ha az alábbi fájlt létrehozva használod a megfelelő code fix-et (Ctrl+.):
usingMicrosoft.EntityFrameworkCore;usingMovieCatalog.Data.Entities;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Threading.Tasks;namespaceMovieCatalog.Data{// Fontos, hogy az osztály internal, mert kívülről csak az interfészt szeretnénk elérhetővé tenni!internalclassMovieCatalogDataService:IMovieCatalogDataService{privateMovieCatalogDbContextDbContext{get;}/* TODO: konstruktor, DI */publicasyncTask<IEnumerable<Genre>>GetGenresAsync()=>// a DbContext egy MovieCatalogDbContext típusú tagváltozóawaitDbContext.Genres.OrderBy(g=>g.Name).ToListAsync();}}
Ez a logika csak azért kell, hogy a következő lépésben ne kelljen hivatkozni az internal láthatóságú MovieCatalogDataService típusra.
Add hozzá a szolgáltatáskonténerhez az adatszolgáltatást az előbbi függvény meghívásával (Terminal projekt, Program.cs):
usingIHosthost=Host.CreateDefaultBuilder(args).ConfigureServices((_,services)=>services.AddDbContext<MovieCatalogDbContext>(o=>o.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=MovieCatalog")).AddHostedService<TestConsole>().AddMovieDataService())//csak ez az új sor.ConfigureLogging(l=>l.AddFilter("Microsoft.EntityFrameworkCore",LogLevel.Warning)).Build();
Injektáltass a TestConsole osztályba egy IMovieCatalogDataService példányt.
A könnyebb konzolos kiírás érdekében definiáld felül a Genre és a TileToString metódusát (Data projekt)
Implementáld most már az XML kommenteknek megfelelően a MovieCatalogDataService legalább még egy metódusát GetGenresAsync-en kívül. Teszteléshez bővítsd a TestConsoleStartAync függvényét. Segítségül megadjuk az alábbi, minden metódust tesztelő egyszerű kódrészletet. A paramétereket cseréld le sajátra! (ahol van paraméter)
// GetGenresAsyncLogger.LogInformation(string.Join(Environment.NewLine,awaitDataService.GetGenresAsync()));// GetTitleByIdAsync - létezőLogger.LogInformation((awaitDataService.GetTitleByIdAsync(1010)).ToString());// GetTitleByIdAsync - nem létezőtry{Logger.LogInformation((awaitDataService.GetTitleByIdAsync(-1)).ToString());}catch(Exceptionex){Logger.LogWarning($"Movie -1 could not be found: {ex}\n");}// GetTitleCountsByGenreIdAsyncLogger.LogInformation(string.Join(Environment.NewLine,(awaitDataService.GetTitleCountsByGenreIdAsync()).Select(kvp=>string.Format($"{kvp.Key} ({kvp.Value})"))));// GetTitlesByNameAsyncLogger.LogInformation(string.Join(Environment.NewLine,awaitDataService.GetTitlesByNameAsync("scream")));
Beadandó:
- az elkészült saját/átírt kódrészletekről készített képernyőképek,
- a terminal alkalmazásban futtatott lekérdezések eredménye a konzolra (Logger) írva.
Bónusz: egy jegy javítás kapható, ha mindegyik lekérdezés meg van írva. Pull Requestben jelezd szövegesen is, hogy elkészültek.