Estoy buscando utilizar el patrón IRepository (respaldado por NHibernate, si es que importa) en un proyecto pequeño. El dominio es simple, intencionalmente para permitirme concentrarme en la comprensión del patrón IRepository. La clase de dominio solitario es Movie
, con propiedades para Year
, Genre
y Title
. Mi intención sería "obtener" películas cuyas propiedades coincidan con los criterios de los tipos mencionados anteriormente.¿Estoy utilizando IRepository correctamente?
Convención parece ser la de tener un IRepository
interfaz genérica, similar a la siguiente:
public interface IRepository<T>
{
T Get(int id);
T[] GetAll();
void Add(T item);
void Update(T item);
void Delete(T item);
}
Con una aplicación de base:
public abstract class Repository<T> : IRepository<T>
{
public T Get(int id) { ... }
public T[] GetAll() { ... }
public void Add(T item) { ... }
public void Update(T item) { ... }
public void Delete(T item) { ... }
}
Luego de tener una interfaz de dominio específico:
public interface IMovieRepository
{
Movie[] GetByGenre(Genre genre);
Movie[] GetByYear(int year);
Movie[] GetByTitle(string title);
}
Con una implementación que también extiende la base Repository
clase:
public class MovieRepository : Repository<Movie>, IMovieRepository
{
public Movie[] GetByGenre(Genre genre) { ... }
public Movie[] GetByYear(int year) { ... }
public Movie[] GetByTitle(string title) { ... }
}
que tendría que añadir la necesaria adaptación a la clase base, así como el concreto, el uso de NHibernate, pero me gustaría saber si estoy en el camino correcto con esta configuración.
Parece que hay un poco de sobrecarga para una sola clase de dominio, aunque sería menos notable si hubiera varias clases de dominio involucradas. En este momento estoy tratando de mantenerlo simple para que pueda precisar el concepto.
Me gusta su sugerencia sobre el uso de un 'Repository' no abstracto para manejar el trabajo de bajo nivel de tipo CRUD, delegado de los repositorios específicos. Sí plantea el problema de obtener una 'ISession' tanto en el repos genérico como en el repositorio específico que lo usa. –
La ISession se debe obtener a través de una ISessionFactory privada en el repositorio. El Repositorio específico luego usa un método WrapxxxInSession del Repositorio genérico. – Goblin
Ah sí, eso ayuda. Me gusta bastante la idea general ... otro beneficio es que el IRepository inyectado se puede burlar para probarlo. Habrá el truco de construir y pasar objetos en el orden correcto, pero es probable que una herramienta de IoC pueda manejar eso. –