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:
- IRepository-grensesnitt - dette grensesnittet er basistypen for alle Repository-typer
- Repository klasse - dette er den generiske Repository klassen
- 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.
}