Come implementare il modello di progettazione del repository in C #

I modelli di progettazione vengono utilizzati come soluzione ai problemi ricorrenti nelle applicazioni e il modello di repository è uno dei modelli di progettazione più utilizzati. Persisterà i vostri oggetti senza la necessità di dover sapere come quegli oggetti verrebbero effettivamente persistiti nel database sottostante, cioè senza doversi preoccupare di come avviene la persistenza dei dati al di sotto. La conoscenza di questa persistenza, cioè la logica della persistenza, è incapsulata all'interno del Repository.

In sostanza, il modello di progettazione del repository facilita il disaccoppiamento della logica di business e dei livelli di accesso ai dati nella tua applicazione con il primo che non deve avere alcuna conoscenza su come avverrebbe effettivamente la persistenza dei dati.

Utilizzando il modello di progettazione del repository, è possibile nascondere i dettagli di come i dati vengono eventualmente archiviati o recuperati da e verso l'archivio dati. Questo archivio dati può essere un database, un file xml, ecc. È possibile applicare questo modello di progettazione anche per nascondere la modalità di accesso ai dati esposti da un servizio Web o da un ORM. Martin Fowler afferma: "Media tra il dominio e i livelli di mappatura dei dati utilizzando un'interfaccia simile a una raccolta per accedere agli oggetti del dominio".

Un repository è definito come una raccolta di oggetti di dominio che risiedono nella memoria. L'MSDN afferma: "Utilizza un repository per separare la logica che recupera i dati e li associa al modello di entità dalla logica di business che agisce sul modello. La logica di business deve essere indipendente dal tipo di dati che comprende il livello dell'origine dati . Ad esempio, il livello dell'origine dati può essere un database, un elenco di SharePoint o un servizio Web ".

Implementazione del modello di progettazione del repository in C #

In questa sezione esploreremo come programmare il modello di progettazione del repository. Nella nostra implementazione del modello di progettazione del repository, i tipi partecipanti includono quanto segue:

  1. Interfaccia IRepository: questa interfaccia è il tipo di base per tutti i tipi di repository
  2. Classe Repository: questa è la classe Repository generica
  3. Una o più classi Repository che implementano l'interfaccia IRepository

Analizziamo ora un codice. La classe seguente mostra come definire classi di entità di base da cui derivare tutte le classi di entità.

public abstract class EntityBase

   {

       public Int64 Id { get; protected set; }

   }

La classe è definita come astratta con un solo campo chiamato "Id". Il campo "Id" è comune a tutte le entità che utilizzi generalmente, non è vero? Ecco come apparirebbe l'interfaccia generica di IRepository.

public interface IRepository where T : EntityBase

   {

       T GetById(Int64 id);

       void Create(T entity);

       void Delete(T entity);

       void Update(T entity);

   }

La classe generica Repository implementa l'interfaccia IRepository e implementa i membri dell'interfaccia.

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

       }

   }

Creazione di repository per classi specifiche

Se desideri creare un repository per un'entità specifica, devi creare una classe che implementa l'interfaccia generica di IRepository. Il seguente listato di codice mostra come questo può essere ottenuto.

public class CustomerRepository : IRepository

   {

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

   }

Allo stesso modo, se dovessi creare un ProductRepository, dovresti prima creare una classe di entità Product che estenda la classe EntityBase.

public class Product: EntityBase

   {

       public string ProductName { get; set; }

       public string Category { get; set; }

   }

La classe ProductRepository dovrebbe implementare l'interfaccia generica IRepository. Ecco come apparirebbe la classe ProductRepository.

public class ProductRepository : IRepository

   {

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

   }