Kako koristiti objekte za prijenos podataka u ASP.NET Core 3.1

Objekt prijenosa podataka (obično poznat kao DTO) obično je instanca klase POCO (obični stari CLR objekt) koja se koristi kao spremnik za enkapsulaciju podataka i prosljeđivanje iz jednog sloja aplikacije u drugi. Obično biste pronašli DTO-ove koji se koriste u uslužnom sloju za vraćanje podataka natrag na prezentacijski sloj. Najveća prednost korištenja DTO-a je odvajanje klijenata od vaših internih struktura podataka.

Ovaj članak raspravlja zašto bismo trebali koristiti objekte za prijenos podataka i kako možemo raditi s njima u ASP.NET Core 3.1. Da biste radili s primjerima koda iz ovog članka, u sustavu biste trebali instalirati Visual Studio 2019. Ako još nemate kopiju, ovdje možete preuzeti Visual Studio 2019. 

Stvorite ASP.NET Core 3.1 API projekt

Prvo, kreirajmo ASP.NET Core projekt u Visual Studiju. Pod pretpostavkom da je Visual Studio 2019 instaliran u vašem sustavu, slijedite korake opisane u nastavku da biste u Visual Studiou stvorili novi ASP.NET Core API projekt.

  1. Pokrenite Visual Studio IDE.
  2. Kliknite "Stvori novi projekt".
  3. U prozoru "Izradi novi projekt" s popisa predložaka odaberite "ASP.NET Core Web Application".
  4. Kliknite Dalje. 
  5. U prozoru „Konfiguriranje novog projekta“ navedite naziv i mjesto za novi projekt.
  6. Kliknite Stvori. 
  7. U sljedećem prozoru "Stvaranje nove web-aplikacije ASP.NET Core" odaberite .NET Core kao vrijeme izvođenja i ASP.NET Core 3.1 (ili noviju) s padajućeg popisa na vrhu.
  8. Odaberite "API" kao predložak projekta da biste stvorili novu aplikaciju ASP.NET Core API. 
  9. Obavezno označite potvrdne okvire "Omogući podršku za Docker" i "Konfiguriraj za HTTPS" jer ovdje nećemo koristiti te značajke.
  10. Provjerite je li provjera autentičnosti postavljena na "Bez provjere autentičnosti" jer ni mi nećemo koristiti provjeru autentičnosti.
  11. Kliknite Stvori. 

To će stvoriti novi ASP.NET Core API projekt u Visual Studiju. Ovaj projekt koristit ćemo za rad s objektima za prijenos podataka u sljedećim odjeljcima ovog članka.

Zašto koristiti objekte za prijenos podataka (DTO)?

Kada dizajnirate i razvijate aplikaciju, ako koristite modele za prosljeđivanje podataka između slojeva i slanje podataka natrag na prezentacijski sloj, tada izlažete unutarnje strukture podataka svoje aplikacije. To je glavna mana u dizajnu vaše prijave.

Odvajanjem slojeva DTO-i olakšavaju život kada implementirate API-je, MVC aplikacije i obrasce za razmjenu poruka kao što je Message Broker. DTO je izvrstan izbor kada želite provući lagani objekt preko žice - posebno kada svoj objekt prolazite putem medija koji ima ograničenu širinu pojasa.

Koristite DTO za apstrakciju

DTO-ove možete iskoristiti za apstrahiranje objekata domene vaše aplikacije s korisničkog sučelja ili prezentacijskog sloja. Pritom je prezentacijski sloj vaše aplikacije odvojen od sloja usluge. Dakle, ako želite promijeniti prezentacijski sloj, to možete učiniti lako dok će aplikacija nastaviti raditi s postojećim slojem domene. Slično tome, možete promijeniti domenski sloj svoje aplikacije bez mijenjanja prezentacijskog sloja aplikacije.

Koristite DTO za skrivanje podataka

Još jedan razlog zbog kojeg biste željeli koristiti DTO-e je skrivanje podataka. Odnosno, pomoću DTO-a možete vratiti samo tražene podatke. Kao primjer, pretpostavimo da imate metodu koja se zove GetAllEfficiees () koja vraća sve podatke koji se odnose na sve zaposlenike. Ilustrirajmo to pisanjem nekog koda.

U projektu koji smo ranije kreirali stvorite novu datoteku nazvanu Employee.cs. U ovu datoteku napišite sljedeći kod kako biste definirali klasu modela nazvanu Zaposlenik.

javni razred Zaposlenik

    {

        javni int Id {get; postavljen; }

        javni niz FirstName {get; postavljen; }

        javni niz LastName {get; postavljen; }

        javni niz DepartmentName {get; postavljen; }

        javna decimala Basic {get; postavljen; }

        javni decimalni DA {get; postavljen; }

        javna decimalna HRA {get; postavljen; }

        javna decimalna NetSalary {get; postavljen; }

    }

Imajte na umu da klasa Employee sadrži svojstva koja uključuju Id, FirstName, LastName, Department, Basic, DA, HRA i NetSalary. Međutim, prezentacijskom sloju možda će trebati samo Id, Ime, Prezime i Ime odjela zaposlenika iz metode GetAllEfficiees (). Ako ova metoda vrati Popis, tada bi svatko mogao vidjeti detalje o plaći zaposlenika. Ti to ne želiš. 

Da biste izbjegli ovaj problem, možete dizajnirati DTO klasu nazvanu EmployeeDTO koja će sadržavati samo tražena svojstva (kao što su Id, Ime, Prezime i Ime odjela).

Stvorite DTO klasu u C #

Da biste to postigli, stvorite datoteku nazvanu EmployeeDTO.cs i tamo napišite sljedeći kod.

javni razred EmployeeDTO

    {

        javni int Id {get; postavljen; }

        javni niz FirstName {get; postavljen; }

        javni niz LastName {get; postavljen; }

        javni niz DepartmentName {get; postavljen; }

    }

Sada kada su klase modela i objekta prijenosa podataka dostupne, možda ćete htjeti stvoriti klasu pretvarača koja sadrži dvije metode: jednu za pretvaranje instance klase modela Employee u instancu EmployeeDTO i (obrnuto) jednu za pretvaranje instance of EmployeeDTO na primjerak klase modela Employee. Za mapiranje ove dvije različite vrste možete iskoristiti i AutoMapper, popularnu biblioteku mapiranja objekata prema objektima. Više o AutoMapperu možete pročitati ovdje.

Trebali biste stvoriti Popis u uslužnom sloju vaše aplikacije i vratiti kolekciju natrag na prezentacijski sloj.

Nepromjenjivost DTO-a

DTO je namijenjen za prijenos podataka s jednog sloja aplikacije na drugi sloj. Potrošač DTO-a može biti ugrađen u .NET / C # / Java ili čak JavaScript / TypeScript. DTO se često serijalizira tako da može biti neovisan o tehnologiji koja se koristi u prijamniku. U većini slučajeva primatelj podataka ne mora mijenjati te podatke nakon primitka - u idealnom slučaju ne bi smio!

Ovo je klasičan primjer važnosti nepromjenjivosti. I upravo bi zato DTO trebao biti nepromjenjiv!

Postoji nekoliko načina na koje možete implementirati nepromjenjive DTO-ove u C #. Mogli biste upotrijebiti ReadOnlyCollection ili nepromjenjive vrste zbirki koje su zaštićene nitima prisutne u prostoru imena System.Collections.Immutable. Možete iskoristiti vrste zapisa u C # 9 i za implementaciju nepromjenjivih DTO-a.

Dizajn vođen domenom očekuje da objekti domene budu vanjski nepromjenjivi. To je dobar razlog da svoje DTO učinite nepromjenjivim, zar ne?

Izazovi DTO serializacije

Trebali biste biti u mogućnosti serijski / deserializirati DTO tako da se može proslijediti niz žicu. Međutim, u praksi ćete možda morati riješiti neke probleme serializacije kada radite s DTO-ima. U stvarnoj aplikaciji možete imati nekoliko entiteta ili klasa modela i svaki od njih može sadržavati reference jedni na druge.

Recimo da ste izgradili sustav upravljanja prisutnošću za zaposlenike u svojoj organizaciji. Tipično u svojoj aplikaciji možete imati klasu nazvanu Zaposlenik koja se odnosi na klasu Korisnik (tj. Zaposlenik je korisnik aplikacije) koja se pak poziva na klasu Uloga. Klasa Uloga može se pozivati ​​na klasu Dozvola, a ona pak na klase PermissionType i PermissionGroup. Sada, kada serializirate instancu klase Employee, na kraju ćete serializirati i ove objekte. Lako je vidjeti da biste u nekim kompliciranim slučajevima mogli na kraju izvršiti serializaciju nekoliko vrsta.

Tu u pomoć dolazi lijeno ili asinkrono utovar. Ovo je značajka koja vam može pomoći učitati entitete samo kada se to zatraži. Za više informacija o tome kako izvesti lijeno učitavanje, možete pogledati moj članak o lijenoj inicijalizaciji u C #.

Objekti za prijenos podataka obično ne sadrže poslovnu logiku - oni sadrže samo podatke. Nepromjenjivost je željena značajka pri radu s DTO-ima. Postoji nekoliko načina na koje možete primijeniti nepromjenjive DTO-e. O nepromjenjivosti u C # razgovarat ću u kasnijem postu ovdje.

Kako učiniti više u ASP.NET Coreu:

  • Kako postupati s pogreškama 404 u ASP.NET Core MVC
  • Kako se koristi injekcija ovisnosti u akcijskim filtrima u ASP.NET Core 3.1
  • Kako se koristi obrazac opcija u ASP.NET Core
  • Kako se koristi usmjeravanje krajnje točke u ASP.NET Core 3.0 MVC
  • Kako izvesti podatke u Excel u ASP.NET Core 3.0
  • Kako koristiti LoggerMessage u ASP.NET Core 3.0
  • Kako poslati e-poštu u ASP.NET Core
  • Kako prijaviti podatke na SQL Server u ASP.NET Core
  • Kako rasporediti poslove pomoću Quartz.NET-a u ASP.NET Core
  • Kako vratiti podatke s ASP.NET Core Web API-ja
  • Kako oblikovati podatke o odgovoru u ASP.NET Core
  • Kako konzumirati ASP.NET Core Web API pomoću RestSharp
  • Kako izvesti asinkrne operacije pomoću Dappera
  • Kako koristiti zastavice značajki u ASP.NET Coreu
  • Kako koristiti atribut FromServices u ASP.NET Core
  • Kako raditi s kolačićima u ASP.NET Coreu
  • Kako raditi sa statičkim datotekama u ASP.NET Coreu
  • Kako koristiti URL za prepisivanje Middlewarea u ASP.NET Core
  • Kako implementirati ograničenje brzine u ASP.NET Core
  • Kako koristiti Azure Application Insights u ASP.NET Core
  • Korištenje naprednih značajki NLog u ASP.NET Core
  • Kako postupati s pogreškama u ASP.NET web API-ju
  • Kako implementirati globalno rukovanje iznimkama u ASP.NET Core MVC
  • Kako postupati s null vrijednostima u ASP.NET Core MVC
  • Napredna verzija u ASP.NET Core Web API
  • Kako raditi s uslugama za radnike u ASP.NET Coreu
  • Kako koristiti API zaštite podataka u ASP.NET Core
  • Kako se koristi uvjetni međuprodukt u ASP.NET Coreu
  • Kako raditi sa stanjem sesije u ASP.NET Coreu
  • Kako napisati učinkovite kontrolere u ASP.NET Core