Cómo implementar el patrón de diseño del repositorio en C #

Los patrones de diseño se utilizan como solución a problemas recurrentes en sus aplicaciones, y el patrón de repositorio es uno de los patrones de diseño más utilizados. Persistirá sus objetos sin la necesidad de tener que saber cómo esos objetos se conservarían realmente en la base de datos subyacente, es decir, sin tener que preocuparse por cómo ocurre la persistencia de datos debajo. El conocimiento de esta persistencia, es decir, la lógica de persistencia, está encapsulado dentro del Repositorio.

En esencia, el patrón de diseño del repositorio facilita el desacoplamiento de la lógica empresarial y las capas de acceso a datos en su aplicación, sin que la primera tenga ningún conocimiento sobre cómo se produciría realmente la persistencia de datos.

Al utilizar el patrón de diseño del repositorio, puede ocultar los detalles de cómo los datos se almacenan o recuperan eventualmente hacia y desde el almacén de datos. Este almacén de datos puede ser una base de datos, un archivo xml, etc. Puede aplicar este patrón de diseño para ocultar incluso cómo se accede a los datos expuestos por un servicio web o un ORM. Martin Fowler afirma: "Media entre el dominio y las capas de mapeo de datos utilizando una interfaz similar a una colección para acceder a los objetos del dominio".

Un repositorio se define como una colección de objetos de dominio que residen en la memoria. El MSDN establece: "Utilice un repositorio para separar la lógica que recupera los datos y los asigna al modelo de entidad de la lógica empresarial que actúa sobre el modelo. La lógica empresarial debe ser independiente del tipo de datos que componen la capa de fuente de datos . Por ejemplo, la capa de fuente de datos puede ser una base de datos, una lista de SharePoint o un servicio web ".

Implementación del patrón de diseño del repositorio en C #

En esta sección exploraremos cómo podemos programar el patrón de diseño del repositorio. En nuestra implementación del patrón de diseño del repositorio, los tipos participantes incluyen lo siguiente:

  1. Interfaz de repositorio IR: esta interfaz es el tipo base para todos los tipos de repositorio
  2. Clase de repositorio: esta es la clase de repositorio genérica
  3. Una o más clases de repositorio que implementan la interfaz IRepository

Ahora profundicemos en un código. La siguiente clase muestra cómo puede definir una clase de entidad base de la que se deben derivar todas sus clases de entidad.

public abstract class EntityBase

   {

       public Int64 Id { get; protected set; }

   }

La clase se define como abstracta con un solo campo, llamado "Id". El campo "Id" es común a todas las entidades que usa generalmente, ¿no es así? Así es como se vería la interfaz genérica de IRepository.

public interface IRepository where T : EntityBase

   {

       T GetById(Int64 id);

       void Create(T entity);

       void Delete(T entity);

       void Update(T entity);

   }

La clase Repository genérica implementa la interfaz IRepository e implementa los miembros de la interfaz.

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

       }

   }

Creando repositorios para clases específicas

Si desea crear un repositorio para una entidad específica, debe crear una clase que implemente la interfaz IRepository genérica. La siguiente lista de códigos muestra cómo se puede lograr esto.

public class CustomerRepository : IRepository

   {

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

   }

De manera similar, si tuviera que crear un ProductRepository, primero debe crear una clase de entidad Producto que amplíe la clase EntityBase.

public class Product: EntityBase

   {

       public string ProductName { get; set; }

       public string Category { get; set; }

   }

La clase ProductRepository debería implementar la interfaz genérica de IRepository. Así es como se vería la clase ProductRepository.

public class ProductRepository : IRepository

   {

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

   }