In aceasta postare, voi arata cum sa implementati un model de depozit generic cu metode asincrone intr-un API Web ASP.NET Core. Daca nu sunteti familiarizati cu ASP.NET Core Web API, va recomand sa cititi mai intai postarea mea Cum sa construiti un API RESTful cu ASP.NET Core.

Array

API – MyMDB (My Movie Database) – va furniza puncte finale care efectueaza operatii CRUD pe o baza de date de filme si stele si va fi usor de extins pentru alte tipuri de caracteristici care pot exista intr-o baza de date de filme.

Voi folosi urmatoarele instrumente pentru dezvoltare:

  • Visual Studio 2019 Community Edition (gratuit)
  • .Net Core SDK 2.2 (gratuit)
  • Microsoft SQL Server Express (gratuit)

Sectiunile acestui post vor fi dupa cum urmeaza:

  • Ce este un depozit?
  • Crearea unui proiect API Web
  • Adaugarea unui model
  • Adaugarea unui controler (filme)
  • Implementarea depozitului
  • Adaugarea unui controler de baza
  • Inregistrarea depozitului la sistemul de injectare a dependentei
  • Crearea bazei de date folosind migratii
  • Testarea
  • Adaugarea unui nou model si a unui controler (stele)

Ce este un depozit?

Martin Fowler defineste un depozit aici dupa cum urmeaza:

Un depozit mediaza intre straturile de mapare a domeniului si a datelor, actionand ca o colectie de obiecte de domeniu in memorie.

Array

Obiectele client construiesc specificatii de interogare declarativ si le trimit in depozit pentru satisfactie. Obiectele pot fi adaugate si eliminate din depozit, asa cum pot dintr-o colectie simpla de obiecte, iar codul de mapare incapsulat de depozit va efectua operatiunile corespunzatoare din culise. Conceptual, un depozit incapsuleaza setul de obiecte persistente intr-un depozit de date si operatiunile efectuate peste ele, oferind o vedere mai orientata spre obiect a stratului de persistenta. Depozitul sustine, de asemenea, obiectivul de a realiza o separare curata si o dependenta unidirectionala intre domeniu si straturile de mapare a datelor.

Crearea unui proiect API Web

Deschideti Visual Studio si selectati Creati un proiect nou -> ASP.

Array

NET Core Web Application . Apoi, denumiti solutia si proiectul.

In dialogul urmator, selectati sablonul API si versiunea ASP.NET Core si apoi faceti clic pe Creare.

Structura proiectului la inceput este urmatoarea:

Adaugarea unui model

In aceasta sectiune, vom adauga primul nostru model de clasa.

Adaugati un proiect nou numit Date in proiect.

Apoi adaugati interfata IEntity in acest folder, dupa cum urmeaza:

Apoi, adaugati folderul Models in proiect si adaugati clasa Movie in acest folder:

In acest moment, trebuie sa construim proiectul.

Adaugarea unui controler

Faceti clic dreapta pe folderul Controllers si selectati Add Controller -> API Conroller with actions, folosind Entity Framework.

Efectuati selectiile dupa cum urmeaza in urmatoarea caseta de dialog:

Dupa schele,

  • Clasa MyMDBContext este adaugata infolderul Data .

MyMDBContext.cs

  • Sirul de conexiune pentru MyMDBContext este adaugat la appsetting.json .
  • MoviesController este creat.

MoviesController.cs

Dupa cum vedeti, exista acces direct la Entity Framework Core in MoviesController .

Relatia este dupa cum urmeaza:

Controler -> EF Core -> SQL Server

Acum, vom adauga un depozit intre controler si EF Core ca strat de abstractizare si vom transforma relatia in:

Controller -> Repository -> EF Core -> SQL Server

Deoarece comportamentul implicit al metodelor este asincron in controlerul API schelat, vom crea metodele noastre in depozit ca si asincron.

Implementarea depozitului

Creati o interfata IRepository in folderul Date cu urmatorul cod:

Aceasta interfata este planificata sa fie un strat de abstractizare pentru diferite ORM-uri.

Acum, vom crea o clasa abstracta pentru EF Core care implementeaza aceasta interfata.

Creati folderul EFCore in folderul Data si adaugati clasa EfCoreRepository aici cu urmatorul cod:

Dupa cum vedeti, am mutat codul legat de EF Core in MoviesController in aceasta clasa.

Ar trebui sa mutam MyMDBContext in folderul EFCore, deoarece este specific EF Core.

Apoi, vom crea o clasa concreta care mosteneste EfCoreRepository .

Creati o clasa numita EfCoreMovieRepository in folderul EFCore cu urmatorul cod:

Acum, putem folosi acest depozit in MoviesController . Pentru a imbunatati lucrurile, sa adaugam un controler de baza la proiect si sa mostenim MoviesController din aceasta clasa de baza.

Adaugarea unui controler de baza

Adaugati MyMDBController ca o clasa abstracta in folderul Controllers cu urmatorul cod:

Actualizati MoviesController cu urmatorul cod:

Inregistrarea depozitului la sistemul de injectare a dependentei

MoviesController are nevoie de un obiect de tip EfCoreMovieRepository in constructor. Vom inregistra acest depozit la sistemul de injectare a dependentei si apoi sistemul DI va furniza acest serviciu MoviesController . Adaugati urmatoarea linie evidentiata la Startup.cs :

Crearea bazei de date folosind migratii

Acum, vom crea baza de date folosind caracteristica EF Core Migrations.

Migrarile ne permit sa cream o baza de date care se potriveste cu modelul nostru de date si sa actualizam schema bazei de date atunci cand modelul nostru de date se schimba.

Deschideti Instrumente -> NuGet Package Manager> Package Manager Console (PMC) si executati urmatoarele comenzi in PMC:

Add-Migration Initial

Update-Database

Acum, vom verifica baza de date creata. Vizualizare deschisa -> SQL Server Object Explorer:

Testarea

In acest moment, ar trebui sa testam punctele noastre finale API. Putem folosi Postman pentru a testa toate metodele si browserul pentru a testa metodele GET.

Daca aveti nevoie de ajutor pentru testare, puteti consulta postarea pe care am mentionat-o mai sus.

Iata o captura de ecran a unuia dintre testele mele:

Adaugarea unui nou model si a unui controler

In aceasta sectiune, vom implementa puncte finale API care efectueaza operatiuni CRUD pe o baza de date de Stele . Vom folosi depozitul de baza si controlerul pe care le-am implementat in sectiunile anterioare.

Pasii vor fi dupa cum urmeaza:

  • Adaugati model Star in folderul Modele cu urmatorul cod:
  • Adaugati clasa EfCoreStarRepository in folderul Date -> EFCore :
  • Adaugati StarsController in folderul Controlere cu urmatorul cod:
  • Adaugati urmatoarea linie evidentiata la Startup.cs:

  • Adaugati urmatoarea linie evidentiata la MyMDBContext.cs :

  • Rulati urmatoarele comenzi in PMC:

Adaugare-migrare StarUpdate-Database

Puteti verifica tabelul nou creat ( Star ) din SQL Server Object Explorer in Visual Studio.

Structura noastra finala a proiectului este urmatoarea:

Acum, ar trebui sa testati fiecare punct final pentru a verifica daca totul este in regula. Mai jos este o captura de ecran a unuia dintre testele mele:

Intentia mea de a scrie aceasta ultima sectiune a fost sa va arat cat de usor este sa extindeti acest model pentru a adauga noi puncte finale API pentru noi functii (emisiuni TV, jocuri video … etc.) odata ce avem depozitul de baza si controlerul.

Puteti gasi intregul proiect in acest depozit GitHub.