Jak zaimplementować wzorzec projektu repozytorium w C #

Wzorce projektowe są używane jako rozwiązanie powtarzających się problemów w aplikacjach, a wzorzec repozytorium jest jednym z najczęściej używanych wzorców projektowych. Utrwala obiekty bez konieczności wiedzieć, w jaki sposób te obiekty byłyby faktycznie utrwalane w podstawowej bazie danych, tj. Bez martwienia się o to, jak utrwalanie danych zachodzi pod spodem. Znajomość tej trwałości, tj. Logika trwałości, jest zawarta w repozytorium.

Zasadniczo wzorzec projektowy repozytorium ułatwia rozłączenie logiki biznesowej i warstw dostępu do danych w aplikacji, przy czym ta pierwsza nie musi mieć żadnej wiedzy na temat tego, jak faktycznie zachodzi trwałość danych.

Korzystając z wzorca projektowego repozytorium, można ukryć szczegóły dotyczące ostatecznego przechowywania lub pobierania danych do iz magazynu danych. Ten magazyn danych może być bazą danych, plikiem xml itp. Możesz zastosować ten wzorzec projektowy, aby nawet ukryć sposób uzyskiwania dostępu do danych udostępnianych przez usługę internetową lub ORM. Martin Fowler stwierdza: „Pośredniczy między domeną a warstwami mapowania danych przy użyciu interfejsu przypominającego kolekcję w celu uzyskania dostępu do obiektów domeny”.

Repozytorium jest zdefiniowane jako zbiór obiektów domeny, które znajdują się w pamięci. MSDN stwierdza: „Użyj repozytorium, aby oddzielić logikę, która pobiera dane i odwzorowuje je na model jednostki, od logiki biznesowej, która działa na model. Logika biznesowa powinna być niezależna od typu danych, które obejmują warstwę źródła danych . Na przykład warstwa źródła danych może być bazą danych, listą programu SharePoint lub usługą sieci Web ”.

Implementowanie wzorca projektowego repozytorium w C #

W tej sekcji zbadamy, w jaki sposób możemy zaprogramować wzorzec projektowy repozytorium. W naszej implementacji wzorca projektowego repozytorium uczestniczące typy obejmują:

  1. Interfejs IRepository - ten interfejs jest typem podstawowym dla wszystkich typów repozytoriów
  2. Klasa repozytorium - jest to ogólna klasa repozytorium
  3. Co najmniej jedna klasa Repository, która implementuje interfejs IRepository

Zagłębmy się teraz w kod. Poniższa klasa pokazuje, jak można zdefiniować podstawowe klasy jednostek, z których powinny pochodzić wszystkie klasy jednostek.

public abstract class EntityBase

   {

       public Int64 Id { get; protected set; }

   }

Klasa jest zdefiniowana jako abstrakcyjna z tylko jednym polem o nazwie „Id”. Pole „Id” jest wspólne dla wszystkich jednostek, których zwykle używasz, prawda? Oto jak wyglądałby ogólny interfejs IRepository.

public interface IRepository where T : EntityBase

   {

       T GetById(Int64 id);

       void Create(T entity);

       void Delete(T entity);

       void Update(T entity);

   }

Ogólna klasa Repository implementuje interfejs IRepository i implementuje elementy składowe interfejsu.

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

       }

   }

Tworzenie repozytoriów dla określonych klas

Jeśli chcesz utworzyć repozytorium dla określonej jednostki, powinieneś utworzyć klasę, która implementuje ogólny interfejs IRepository. Poniższa lista kodu pokazuje, jak można to osiągnąć.

public class CustomerRepository : IRepository

   {

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

   }

Podobnie, jeśli chcesz utworzyć ProductRepository, powinieneś najpierw utworzyć klasę jednostki Product, która rozszerza klasę EntityBase.

public class Product: EntityBase

   {

       public string ProductName { get; set; }

       public string Category { get; set; }

   }

Klasa ProductRepository powinna implementować ogólny interfejs IRepository. Oto jak wyglądałaby klasa ProductRepository.

public class ProductRepository : IRepository

   {

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

   }