Programmering

Hvordan implementere repository designmønsteret i C #

Designmønstre brukes som en løsning på gjentatte problemer i applikasjonene dine, og Repository-mønsteret er et av de mest brukte designmønstrene. Det vil vedvare objektene dine uten behov for å måtte vite hvordan disse objektene faktisk ville være vedvarende i den underliggende databasen, dvs. uten å måtte være plaget av hvordan datapresistensen skjer under. Kunnskapen om denne utholdenheten, dvs. utholdenhetslogikken, er innkapslet inne i depotet.

I hovedsak muliggjør repository-designmønsteret avkobling av forretningslogikken og datatilgangslagene i applikasjonen din med den tidligere ikke å ha noen kunnskap om hvordan datautholdenhet faktisk ville finne sted.

Ved å bruke repository-designmønsteret kan du skjule detaljene for hvordan dataene til slutt lagres eller hentes til og fra datalageret. Denne datalageret kan være en database, en xml-fil osv. Du kan bruke dette designmønsteret for å til og med skjule hvordan data som blir eksponert av en webtjeneste eller en ORM er tilgjengelig. Martin Fowler uttaler: "Formidler mellom domenet og lagene for datakartlegging ved hjelp av et samlingsliknende grensesnitt for tilgang til domeneobjekter."

Et depot er definert som en samling av domeneobjekter som ligger i minnet. MSDN sier: "Bruk et depot for å skille logikken som henter dataene og tilordner den til enhetsmodellen fra virksomhetslogikken som virker på modellen. Virksomhetslogikken skal være agnostisk til typen data som omfatter datakildelaget . Datakildelaget kan for eksempel være en database, en SharePoint-liste eller en webtjeneste. "

Implementering av repository designmønsteret i C #

I denne delen vil vi undersøke hvordan vi kan programmere repository designmønsteret. I vår implementering av Repository-designmønsteret inkluderer de deltakende typene følgende:

  1. IRepository-grensesnitt - dette grensesnittet er basistypen for alle Repository-typer
  2. Repository klasse - dette er den generiske Repository klassen
  3. En eller flere depotklasser som implementerer IRepository-grensesnittet

La oss nå grave i litt kode. Følgende klasse viser hvordan du kan definere en baseenhetsklasse som alle enhetsklassene dine skal hentes fra.

offentlig abstrakt klasse EntityBase

   {

offentlig Int64 Id {get; beskyttet sett; }

   }

Klassen er definert som abstrakt med bare ett felt - kalt "Id". "Id" -feltet er vanlig for alle enheter du vanligvis bruker, ikke sant? Slik ser det generiske IRepository-grensesnittet ut.

offentlig grensesnitt IRepository der T: EntityBase

   {

T GetById (Int64 id);

ugyldig Opprett (T-enhet);

ugyldig Slett (T-enhet);

ugyldig oppdatering (T-enhet);

   }

Den generiske Repository-klassen implementerer IRepository-grensesnittet og implementerer medlemmene av grensesnittet.

public class Repository: IRepository der T: EntityBase

   {

offentlig ugyldighet Opprett (T-enhet)

       {

// Skriv logikken din her for å vedvare enheten

       }

public void Delete (T-enhet)

       {

// Skriv logikken din her for å slette en enhet

       }

offentlig T GetById (lang id)

       {

// Skriv logikken din her for å hente en enhet etter ID

kaste nye NotImplementedException ();

       }

offentlig ugyldig oppdatering (T-enhet)

       {

// Skriv logikken din her for å oppdatere en enhet

       }

   }

Opprette arkiver for bestemte klasser

Hvis du ønsker å opprette et depot for en bestemt enhet, bør du opprette en klasse som implementerer det generiske IRepository-grensesnittet. Følgende kodeliste viser hvordan dette kan oppnås.

offentlig klasse CustomerRepository: IRepository

   {

// Skriv koden din her for å implementere hver av metodene i IRepository-grensesnittet.

   }

På samme måte, hvis du skulle opprette et ProductRepository, bør du først opprette et produkt av enhetsklassen som utvider EntityBase-klassen.

offentlig klasse Produkt: EntityBase

   {

offentlig streng Produktnavn {get; sett; }

offentlig streng Kategori {get; sett; }

   }

ProductRepository-klassen skal implementere det generiske IRepository-grensesnittet. Slik ser ProductRepository-klassen ut.

offentlig klasse ProductRepository: IRepository

   {

// Skriv koden din her for å implementere hver av metodene i IRepository-grensesnittet.

   }

$config[zx-auto] not found$config[zx-overlay] not found