Kako implementirati obrazac dizajna spremišta u C #

Uzorci dizajna koriste se kao rješenje za ponavljajuće probleme u vašim aplikacijama, a obrazac Repozitorija jedan je od najčešće korištenih uzoraka dizajna. I dalje će vaši objekti ostati bez potrebe da moraju znati kako bi se ti objekti zapravo zadržali u osnovnoj bazi podataka, tj. Bez potrebe da vas zamara kako se trajanje podataka događa ispod. Znanje o ovoj postojanosti, tj. Logika ustrajnosti, nalazi se unutar Spremišta.

U osnovi, obrazac dizajna Repozitorija omogućuje razdvajanje poslovne logike i slojeva pristupa podacima u vašoj aplikaciji, s tim da prvi ne mora imati nikakvo znanje o tome kako bi se postojanje podataka zapravo odvijalo.

Korištenjem uzorka dizajna Repozitorija možete sakriti detalje o načinu na koji se podaci na kraju pohranjuju ili dohvaćaju u i iz spremišta podataka. Ova pohrana podataka može biti baza podataka, xml datoteka itd. Možete primijeniti ovaj obrazac dizajna da biste čak sakrili kako se pristupa podacima kojima je izložena web usluga ili ORM. Martin Fowler navodi: "Posreduje između slojeva domene i mapiranja podataka koristeći sučelje nalik zbirci za pristup objektima domene."

Repozitorij je definiran kao kolekcija objekata domene koji se nalaze u memoriji. MSDN kaže: "Upotrijebite spremište za odvajanje logike koja dohvaća podatke i mapiranje na entitetski model od poslovne logike koja djeluje na model. Poslovna logika trebala bi biti agnostična prema vrsti podataka koja sadrži sloj izvora podataka Na primjer, sloj izvora podataka može biti baza podataka, SharePointov popis ili web usluga. "

Implementacija uzorka dizajna spremišta u C #

U ovom ćemo odjeljku istražiti kako možemo programirati obrazac dizajna spremišta. U našoj provedbi uzorka dizajna Repozitorija, tipovi koji sudjeluju uključuju sljedeće:

  1. IRepository sučelje - ovo sučelje je osnovni tip za sve tipove Repozitorija
  2. Klasa Repozitorija - ovo je generička klasa Repozitorija
  3. Jedna ili više klasa Repozitorija koji implementiraju sučelje IRepository

Krenimo sada u neki kod. Sljedeća klasa pokazuje kako možete definirati osnovne klase entiteta iz kojih trebaju biti izvedene sve vaše klase entiteta.

public abstract class EntityBase

   {

       public Int64 Id { get; protected set; }

   }

Klasa je definirana kao apstraktna sa samo jednim poljem nazvanim "Id". Polje "Id" zajedničko je svim entitetima koje obično upotrebljavate, zar ne? Evo kako bi izgledalo generičko sučelje IRepository.

public interface IRepository where T : EntityBase

   {

       T GetById(Int64 id);

       void Create(T entity);

       void Delete(T entity);

       void Update(T entity);

   }

Generička klasa Repozitorija implementira sučelje IRepository i implementira članove sučelja.

public class Repository : IRepository where T : EntityBase

   {

       public void Create(T entity)

       {

           //Write your logic here to persist the entity

       }

       public void Delete(T entity)

       {

           //Write your logic here to delete an entity

       }

       public T GetById(long id)

       {

           //Write your logic here to retrieve an entity by Id

           throw new NotImplementedException();

       }

       public void Update(T entity)

       {

           //Write your logic here to update an entity

       }

   }

Stvaranje spremišta za određene klase

Ako želite stvoriti Repozitorij za određeni entitet, trebali biste stvoriti klasu koja implementira generičko sučelje IRepository. Sljedeći popis kodova pokazuje kako se to može postići.

public class CustomerRepository : IRepository

   {

       //Write your code here to implement each of the methods of the IRepository interface.

   }

Slično tome, ako biste trebali stvoriti ProductRepository, prvo biste trebali stvoriti Entitet klase Product koji proširuje klasu EntityBase.

public class Product: EntityBase

   {

       public string ProductName { get; set; }

       public string Category { get; set; }

   }

Klasa ProductRepository trebala bi implementirati generičko sučelje IRepository. Evo kako bi izgledala klasa ProductRepository.

public class ProductRepository : IRepository

   {

       //Write your code here to implement each of the methods of the IRepository interface.

   }