So implementieren Sie das Repository-Entwurfsmuster in C #

Entwurfsmuster werden als Lösung für wiederkehrende Probleme in Ihren Anwendungen verwendet, und das Repository-Muster ist eines der am häufigsten verwendeten Entwurfsmuster. Ihre Objekte bleiben erhalten, ohne dass Sie wissen müssen, wie diese Objekte tatsächlich in der zugrunde liegenden Datenbank gespeichert werden, ohne sich darum kümmern zu müssen, wie die Datenpersistenz darunter abläuft. Das Wissen über diese Persistenz, dh die Persistenzlogik, ist im Repository zusammengefasst.

Im Wesentlichen erleichtert das Repository-Entwurfsmuster die Entkopplung der Geschäftslogik und der Datenzugriffsebenen in Ihrer Anwendung, wobei erstere keine Kenntnisse darüber haben müssen, wie die Datenpersistenz tatsächlich stattfinden würde.

Wenn Sie das Repository-Entwurfsmuster verwenden, können Sie die Details darüber verbergen, wie die Daten schließlich gespeichert und zum und vom Datenspeicher abgerufen werden. Dieser Datenspeicher kann eine Datenbank, eine XML-Datei usw. sein. Sie können dieses Entwurfsmuster anwenden, um sogar zu verbergen, wie auf Daten zugegriffen wird, die von einem Webdienst oder einem ORM verfügbar gemacht werden. Martin Fowler erklärt: "Vermittelt zwischen der Domänen- und der Datenzuordnungsschicht über eine sammlungsähnliche Schnittstelle für den Zugriff auf Domänenobjekte."

Ein Repository ist definiert als eine Sammlung von Domänenobjekten, die sich im Speicher befinden. In der MSDN heißt es: "Verwenden Sie ein Repository, um die Logik, die die Daten abruft und sie dem Entitätsmodell zuordnet, von der Geschäftslogik zu trennen, die auf das Modell einwirkt. Die Geschäftslogik sollte unabhängig vom Datentyp sein, aus dem die Datenquellenschicht besteht Die Datenquellenebene kann beispielsweise eine Datenbank, eine SharePoint-Liste oder ein Webdienst sein. "

Implementieren des Repository-Entwurfsmusters in C #

In diesem Abschnitt werden wir untersuchen, wie wir das Repository-Entwurfsmuster programmieren können. Bei unserer Implementierung des Repository-Entwurfsmusters umfassen die teilnehmenden Typen Folgendes:

  1. IRepository-Schnittstelle - Diese Schnittstelle ist der Basistyp für alle Repository-Typen
  2. Repository-Klasse - Dies ist die generische Repository-Klasse
  3. Eine oder mehrere Repository-Klassen, die die IRepository-Schnittstelle implementieren

Lassen Sie uns nun einen Code untersuchen. Die folgende Klasse zeigt, wie Sie Basisentitätsklassen definieren können, von denen alle Ihre Entitätsklassen abgeleitet werden sollen.

public abstract class EntityBase

   {

       public Int64 Id { get; protected set; }

   }

Die Klasse ist als abstrakt mit nur einem Feld mit dem Namen "Id" definiert. Das Feld "ID" ist allen Entitäten gemeinsam, die Sie normalerweise verwenden, nicht wahr? So würde die generische IRepository-Oberfläche aussehen.

public interface IRepository where T : EntityBase

   {

       T GetById(Int64 id);

       void Create(T entity);

       void Delete(T entity);

       void Update(T entity);

   }

Die generische Repository-Klasse implementiert die IRepository-Schnittstelle und die Mitglieder der Schnittstelle.

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

       }

   }

Erstellen von Repositorys für bestimmte Klassen

Wenn Sie ein Repository für eine bestimmte Entität erstellen möchten, sollten Sie eine Klasse erstellen, die die generische IRepository-Schnittstelle implementiert. Die folgende Codeliste zeigt, wie dies erreicht werden kann.

public class CustomerRepository : IRepository

   {

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

   }

Wenn Sie ein ProductRepository erstellen möchten, sollten Sie zunächst eine Entitätsklasse Product erstellen, die die EntityBase-Klasse erweitert.

public class Product: EntityBase

   {

       public string ProductName { get; set; }

       public string Category { get; set; }

   }

Die ProductRepository-Klasse sollte die generische IRepository-Schnittstelle implementieren. So würde die ProductRepository-Klasse aussehen.

public class ProductRepository : IRepository

   {

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

   }