Estoy tratando de implementar un patrón genérico de repositorio. Encontré este sitio que creo que está bien explicado. http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-trianglePatrón genérico de repositorio con UnitOfWork Patrón
Mi propósito es salvar a los desarrolladores con el tiempo y las teclas y sé que esto me ayudará.
Así que tengo 2 preguntas:
1. ¿Es este un buen enfoque o no, tendré algunos problemas en el futuro?
2. ¿Cómo puedo combinarlo con el patrón Unitofwork ?, no puedo crear una instancia de la clase abstracta por supuesto, por lo que el siguiente código no es válido.
public class UnitOfWork : IDisposable
{
#region Private fields
private readonly MyCompanyContext _context = new MyCompanyContext();
private GenericRepository<MyCompanyContext, Task> _taskRepository;
public GenericRepository<MyCompanyContext, Task> TaskRepository
{
get
{
return _taskRepository ??
(_taskRepository = new GenericRepository<MyCompanyContext, Task>());
}
}
namespace MyCompany.DAL.Repository
{
public interface IGenericRepository<T> where T : class
{
IQueryable<T> GetAll();
IQueryable<T> FindBy(Expression<Func<T, bool>> predicate);
void Add(T entity);
void Delete(T entity);
void Edit(T entity);
void Save();
}
public abstract class GenericRepository<C, T> :
IGenericRepository<T>
where T : class
where C : DbContext, new()
{
private C _entities = new C();
public C Context
{
get { return _entities; }
set { _entities = value; }
}
public virtual IQueryable<T> GetAll()
{
IQueryable<T> query = _entities.Set<T>();
return query;
}
public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
{
IQueryable<T> query = _entities.Set<T>().Where(predicate);
return query;
}
public virtual void Add(T entity)
{
_entities.Set<T>().Add(entity);
}
public virtual void Delete(T entity)
{
_entities.Set<T>().Remove(entity);
}
public virtual void Edit(T entity)
{
_entities.Entry(entity).State = System.Data.EntityState.Modified;
}
public virtual void Save()
{
_entities.SaveChanges();
}
}
}
No creo que agregue otra capa de abstracción, simplemente estoy simplificando mi código para hacerlo más fácil de usar. con el patrón de repositorio genérico podría hacer el CRUD de manera muy eficiente. Pero es por eso que hice mi primera pregunta en primer lugar, ¿Tendría problemas técnicos con este enfoque? –
Sí, tienes razón, con UOW realmente no estás agregando otra capa de abstracción. Sin embargo, creo que, salvo en escenarios muy simples, el UOW no es muy útil, y sí, creo que podría tener problemas técnicos si tiene que gestionar relaciones de muchos a muchos. –
@LuisEValencia> hm, no veo cómo esto simplifica tu código? – Giedrius