Designmønstre bruges som en løsning på tilbagevendende problemer i dine applikationer, og repository-mønsteret er et af de mest anvendte designmønstre. Det vil vedvare dine objekter uden behov for at skulle vide, hvordan disse objekter rent faktisk ville være vedvarende i den underliggende database, dvs. uden at skulle være generet over, hvordan datapretentionen finder sted nedenunder. Kendskabet til denne vedholdenhed, dvs. vedholdenhedslogikken, er indkapslet inde i lageret.
I det væsentlige letter repository-designmønsteret afkobling af forretningslogikken og dataadgangslagene i din applikation med den tidligere ikke at have nogen viden om, hvordan datapretention faktisk ville finde sted.
Ved at bruge repository-designmønsteret kan du skjule detaljerne i, hvordan dataene til sidst gemmes eller hentes til og fra datalageret. Denne datalager kan være en database, en xml-fil osv. Du kan anvende dette designmønster for endda at skjule, hvordan data, der eksponeres af en webtjeneste eller en ORM, åbnes. Martin Fowler udtaler: "Formidler mellem domænet og datakortlag ved hjælp af en samlingslignende grænseflade til adgang til domæneobjekter."
Et lager er defineret som en samling af domæneobjekter, der findes i hukommelsen. MSDN siger: "Brug et lager til at adskille den logik, der henter dataene og kortlægger den til enhedsmodellen fra den forretningslogik, der fungerer på modellen. Virksomhedslogikken skal være agnostisk i forhold til den datatype, der omfatter datakildelaget . Datakildelaget kan f.eks. Være en database, en SharePoint-liste eller en webservice. "
Implementering af repository design mønster i C #
I dette afsnit undersøger vi, hvordan vi kan programmere repository-designmønsteret. I vores implementering af repository-designmønsteret inkluderer de deltagende typer følgende:
- IRepository interface - denne interface er basistypen for alle Repository typer
- Repository klasse - dette er den generiske Repository klasse
- Én eller flere lagerklasser, der implementerer IR-lagergrænsefladen
Lad os nu grave i noget kode. Den følgende klasse viser, hvordan du kan definere en basisenhedsklasse, hvorfra alle dine enhedsklasser skal afledes.
offentlig abstrakt klasse EntityBase
{
offentlig Int64 Id {get; beskyttet sæt; }
}
Klassen er defineret som abstrakt med kun et felt - kaldet "Id". Feltet "Id" er fælles for alle enheder, du generelt bruger, er det ikke? Sådan ser den generiske IRepository-grænseflade ud.
offentlig grænseflade IR-depot, hvor T: EntityBase
{
T GetById (Int64 id);
ugyldigt Opret (T-enhed);
ugyldigt Slet (T-enhed);
ugyldig opdatering (T-enhed);
}
Den generiske Repository-klasse implementerer IRepository-grænsefladen og implementerer medlemmerne af grænsefladen.
public class Repository: IRepository hvor T: EntityBase
{
offentlig tomrum Opret (T-enhed)
{
// Skriv din logik her for at opretholde enheden
}
offentlig tomrum Slet (T-enhed)
{
// Skriv din logik her for at slette en enhed
}
offentlig T GetById (lang id)
{
// Skriv din logik her for at hente en enhed efter id
smid ny NotImplementedException ();
}
offentlig ugyldig opdatering (T-enhed)
{
// Skriv din logik her for at opdatere en enhed
}
}
Oprettelse af arkiver til bestemte klasser
Hvis du vil oprette et lager til en bestemt enhed, skal du oprette en klasse, der implementerer den generiske IR-lagergrænseflade. Følgende kodeliste viser, hvordan dette kan opnås.
offentlig klasse CustomerRepository: IRepository
{
// Skriv din kode her for at implementere hver af metoderne i IRepository-grænsefladen.
}
Tilsvarende, hvis du skulle oprette et ProductRepository, skal du først oprette et produkt af enhedsklassen, der udvider klassen EntityBase.
offentlig klasse Produkt: EntityBase
{
offentlig streng Produktnavn {get; sæt; }
offentlig streng Kategori {get; sæt; }
}
Klassen ProductRepository skal implementere den generiske IRepository-grænseflade. Sådan ser klassen ProductRepository ud.
offentlig klasse ProductRepository: IRepository
{
// Skriv din kode her for at implementere hver af metoderne i IRepository-grænsefladen.
}