Programmering

Sådan implementeres repository-designmønsteret i C #

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:

  1. IRepository interface - denne interface er basistypen for alle Repository typer
  2. Repository klasse - dette er den generiske Repository klasse
  3. É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.

   }