Comment implémenter le modèle de conception de référentiel en C #

Les modèles de conception sont utilisés comme solution aux problèmes récurrents dans vos applications, et le modèle de référentiel est l'un des modèles de conception les plus utilisés. Cela persistera vos objets sans avoir besoin de savoir comment ces objets seraient réellement persistés dans la base de données sous-jacente, c'est-à-dire sans avoir à se soucier de la façon dont la persistance des données se produit en dessous. La connaissance de cette persistance, c'est-à-dire la logique de persistance, est encapsulée dans le référentiel.

Essentiellement, le modèle de conception de référentiel facilite le découplage de la logique métier et des couches d'accès aux données dans votre application, la première n'ayant aucune connaissance de la manière dont la persistance des données se produirait réellement.

En utilisant le modèle de conception de référentiel, vous pouvez masquer les détails de la façon dont les données sont finalement stockées ou récupérées vers et depuis le magasin de données. Ce magasin de données peut être une base de données, un fichier xml, etc. Vous pouvez appliquer ce modèle de conception pour même masquer l'accès aux données exposées par un service Web ou un ORM. Martin Fowler déclare: "Il sert d'intermédiaire entre les couches de mappage de domaine et de données en utilisant une interface de type collection pour accéder aux objets du domaine."

Un référentiel est défini comme une collection d'objets de domaine résidant dans la mémoire. Le MSDN indique: "Utilisez un référentiel pour séparer la logique qui récupère les données et les mappe au modèle d'entité de la logique métier qui agit sur le modèle. La logique métier doit être indépendante du type de données qui comprend la couche de source de données . Par exemple, la couche de source de données peut être une base de données, une liste SharePoint ou un service Web. »

Implémentation du modèle de conception de référentiel en C #

Dans cette section, nous explorerons comment nous pouvons programmer le modèle de conception du référentiel. Dans notre implémentation du modèle de conception de référentiel, les types participants sont les suivants:

  1. Interface IRepository - cette interface est le type de base pour tous les types de référentiel
  2. Classe de référentiel - il s'agit de la classe de référentiel générique
  3. Une ou plusieurs classes Repository qui implémentent l'interface IRepository

Voyons maintenant un peu de code. La classe suivante montre comment vous pouvez définir une classe d'entité de base à partir de laquelle toutes vos classes d'entité doivent être dérivées.

public abstract class EntityBase

   {

       public Int64 Id { get; protected set; }

   }

La classe est définie comme abstraite avec un seul champ - nommé "Id". Le champ "Id" est commun à toutes les entités que vous utilisez généralement, n'est-ce pas? Voici à quoi ressemblerait l'interface générique d'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 générique Repository implémente l'interface IRepository et implémente les membres de l'interface.

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

       }

   }

Création de référentiels pour des classes spécifiques

Si vous souhaitez créer un référentiel pour une entité spécifique, vous devez créer une classe qui implémente l'interface générique IRepository. La liste de codes suivante montre comment cela peut être réalisé.

public class CustomerRepository : IRepository

   {

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

   }

De même, si vous deviez créer un ProductRepository, vous devez d'abord créer une classe d'entité Product qui étend la classe EntityBase.

public class Product: EntityBase

   {

       public string ProductName { get; set; }

       public string Category { get; set; }

   }

La classe ProductRepository doit implémenter l'interface générique IRepository. Voici à quoi ressemblerait la classe ProductRepository.

public class ProductRepository : IRepository

   {

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

   }