Как да приложим шаблона за проектиране на хранилището в C #

Шаблоните на дизайна се използват като решение на повтарящи се проблеми във вашите приложения, а моделът на хранилището е един от най-често използваните дизайнерски модели. Той ще продължи да поддържа вашите обекти, без да е необходимо да знаете как тези обекти биха били действително запазени в основната база данни, т.е. без да се притеснявате за това как трайността на данните се случва отдолу. Знанието за това постоянство, т.е. логиката на постоянство, е капсулирано в хранилището.

По същество шаблонът за проектиране на хранилището улеснява разединяването на бизнес логиката и слоевете за достъп до данни във вашето приложение, като първият не трябва да има никакви знания за това как действително ще се осъществи устойчивостта на данните.

С помощта на шаблона за проектиране на хранилището можете да скриете подробностите за това как данните в крайна сметка се съхраняват или извличат от и от хранилището на данни. Това хранилище на данни може да бъде база данни, xml файл и т.н. Можете да приложите този модел на дизайн, за да скриете дори как се осъществява достъп до данни, които са изложени от уеб услуга или ORM. Мартин Фаулър заявява: „Посредничи между слоевете за картографиране на домейн и данни, използвайки интерфейс, подобен на колекция за достъп до обекти на домейн.

Хранилището се дефинира като колекция от домейн обекти, които се намират в паметта. MSDN гласи: "Използвайте хранилище, за да отделите логиката, която извлича данните, и да я преобразува в модела на обекта от бизнес логиката, която действа върху модела. Бизнес логиката трябва да бъде агностична за типа данни, които съдържат слоя източник на данни Например слоят източник на данни може да бъде база данни, списък на SharePoint или уеб услуга. "

Внедряване на шаблона за проектиране на хранилището в C #

В този раздел ще проучим как можем да програмираме шаблона за проектиране на хранилището. В нашето изпълнение на модела за проектиране на хранилището, участващите типове включват следното:

  1. IRepository интерфейс - този интерфейс е основният тип за всички типове хранилища
  2. Клас на хранилището - това е родовият клас на хранилището
  3. Един или повече класове на хранилището, които реализират интерфейса IRepository

Нека сега да копаем в някакъв код. Следващият клас показва как можете да дефинирате базови класове обекти, от които трябва да бъдат получени всичките ви класове обекти.

public abstract class EntityBase

   {

       public Int64 Id { get; protected set; }

   }

Класът се определя като абстрактен само с едно поле - наречено "Id". Полето "Id" е общо за всички обекти, които обикновено използвате, нали? Ето как би изглеждал общият интерфейс на IRepository.

public interface IRepository where T : EntityBase

   {

       T GetById(Int64 id);

       void Create(T entity);

       void Delete(T entity);

       void Update(T entity);

   }

Общият клас Repository реализира интерфейса IRepository и реализира членовете на интерфейса.

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

       }

   }

Създаване на хранилища за конкретни класове

Ако искате да създадете хранилище за конкретен обект, трябва да създадете клас, който реализира общия интерфейс IRepository. Следният списък с кодове показва как може да се постигне това.

public class CustomerRepository : IRepository

   {

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

   }

По същия начин, ако трябваше да създадете ProductRepository, първо трябва да създадете клас на обект Product, който разширява класа EntityBase.

public class Product: EntityBase

   {

       public string ProductName { get; set; }

       public string Category { get; set; }

   }

Класът ProductRepository трябва да реализира общия интерфейс IRepository. Ето как би изглеждал класът ProductRepository.

public class ProductRepository : IRepository

   {

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

   }