Saltar al contenido

¿Qué es un IRepository y para qué se utiliza?

Comprende el código bien previamente a usarlo a tu proyecto si ttienes algo que aportar puedes decirlo en los comentarios.

Solución:

MVC promueve la separación de preocupaciones, pero eso no se detiene en el nivel MVC.

El acceso a los datos es una preocupación en sí misma. Debe hacerse en el bit M de MVC, es decir, el modelo. La forma en que estructura su modelo depende de usted, pero la gente suele seguir patrones probados y comprobados (¿por qué reinventar la rueda?). El patrón de repositorio es el estándar actual. Sin embargo, no espere una fórmula simple, porque las variaciones son tantas como desarrolladores, casi.

IRepository es solo una interfaz que usted crea (no es parte de MVC o ASP.NET o .NET). Le permite “desacoplar” sus repositorios de implementaciones reales. El desacoplamiento es bueno porque significa que su código …:

  1. Tu código es mucho más reutilizable. Esto es simplemente bueno.
  2. Su código puede usar Inversión de control (o Inyección de dependencia). Esto es bueno para mantener sus preocupaciones bien separadas. Es especialmente bueno porque permite realizar pruebas unitarias …
  3. Su código puede ser probado por unidad. Esto es especialmente bueno en proyectos grandes con algoritmos complejos. Es bueno en todas partes porque aumenta su comprensión de las tecnologías con las que está trabajando y los dominios que está tratando de modelar en software.
  4. Su código se basa en las mejores prácticas, siguiendo un patrón común. Esto es bueno porque facilita mucho el mantenimiento.

Entonces, habiéndote vendido el desacoplamiento, la respuesta a tu pregunta es que IRepository es una interfaz que tú creas y de la que haces que hereden tus repositorios. Le brinda una jerarquía de clases confiable para trabajar.

Generalmente uso un repositorio de IR genérico:

IRepositorio

Donde TEntity es, bueno, una entidad. El código que utilizo es:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Wingspan.Web.Mvc

    public interface IRepository where TEntity : class
    
        List FetchAll();
        IQueryable Query get;
        void Add(TEntity entity);
        void Delete(TEntity entity);
        void Save();
    

Una implementación concreta de esta interfaz sería:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;

using Wingspan.Web.Mvc;

namespace ES.eLearning.Domain

    public class SqlRepository : IRepository where T : class
    
        DataContext db;
        public SqlRepository(DataContext db)
        
            this.db = db;
        

        #region IRepository Members

        public IQueryable Query
        
            get  return db.GetTable(); 
        

        public List FetchAll()
        
            return Query.ToList();
        

        public void Add(T entity)
        
            db.GetTable().InsertOnSubmit(entity);
        

        public void Delete(T entity)
        
            db.GetTable().DeleteOnSubmit(entity);
        

        public void Save()
        
            db.SubmitChanges();
        

        #endregion
    

Esto me permite escribir:

SqlRepository UserCoursesRepository = new SqlRepository(db);

Donde db es una instancia de DataContext inyectada en, digamos, un Service.

Con UserCoursesRepository ahora puedo escribir métodos en mi clase de servicio como:

public void DeleteUserCourse(int courseId)
        
            var uc = (UserCoursesRepository.Query.Where(x => x.IdUser == UserId && x.IdCourse == courseId)).Single();
            UserCoursesRepository.Delete(uc);
            UserCoursesRepository.Save();
        

Y ahora en mis controladores, puedo escribir:

MyService.DeleteUserCourse(5);
MyService.Save();

Con este patrón, el desarrollo de su aplicación se convierte más en una línea de montaje que conduce a un controlador MUY simple. Cada pieza de la línea de montaje se puede probar independientemente de todo lo demás, por lo que los errores se cortan de raíz.

Si esta es una respuesta larga y difícil de manejar es porque la respuesta real es:

Comprar Steven Sanderson’s book Pro ASP.NET MVC 2 Framework y aprende a pensar en MVC.

Un IRepository es una interfaz que especificas cuando quieres implementar el patrón de repositorio. Como dijo @Brian Ball, no es parte de .NET, es una interfaz que usted crea.

Los desarrolladores que utilizan Repository Pattern recomiendan ampliamente el uso de una interfaz para la implementación. Por ejemplo, en la aplicación que estoy desarrollando ahora mismo, tengo 5 repositorios. 4 específicos y 1 genérico. Cada uno hereda de un IRepository lo que garantiza que no tendré problemas en el futuro con diferencias en las implementaciones.

En cuanto a los ejemplos de código, intentaré:

interface IRepository where T : class 
    IQueryable Select();

Implementado como repositorio genérico:

public class Repository : IRepository where T : class 
    public IQueryable Select() 
        return this.ObjectContext.CreateObjectSet();
    

Implementado como repositorio especializado:

public class EmployeeRepository : IRepository 
    public IQueryable Select() 
        return this.ObjectContext.Employees;
    

Ambos Repository y EmployeeRepository implementar IRepository, sin embargo, realizan la consulta de forma ligeramente diferente. El repositorio genérico tiene que crear un conjunto de objetos de T antes de que pueda intentar hacer algo.

Manten eso en mente Repository se supone que está bloqueado en la interfaz, donde como EmployeeRepository puede implementar métodos más especializados para lograr una lógica más compleja.

Espero que esto te ayude un poco.

IRepository no es un tipo definido en .Net framework. Por lo general, cuando ve una interfaz con ese nombre, el programa usa el patrón de repositorio (https://web.archive.org/web/20110503184234/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/10/08/ the-repository-pattern.aspx). Generalmente, cuando las personas usan este patrón, crearán una interfaz a la que se adhieren todos los repositorios. Hay muchos beneficios al hacer esto. Algunos de los beneficios son la eliminación de copuplicaciones de código y las pruebas unitarias.

También es común que esto se haga para poder aprovecharlo con IoC (http://en.wikipedia.org/wiki/Inversion_of_control).

Si para ti ha sido provechoso nuestro artículo, te agradeceríamos que lo compartas con el resto desarrolladores de esta forma contrubuyes a dar difusión a nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *