Hay dos maneras de definir repositorio. La primera es mediante la exposición de IQueryable que es suficiente para hacer cualquier cosa:
public interface IRepository<T> where T: class
{
IQueryable<T> GetQuery();
// This method requires additional knowledge about entity
// or more compilcated approach. The point of the method
// is to check EF's internal storage first before querying DB
// T GetById(int Id);
void Delete(T entity);
void Add(T entity);
void Attach(T entity);
}
Tener algo como GetAll
o First
es simplemente redundante porque GetQuery
servidores de todo. El segundo enfoque es repositorio específico donde no exponer IQueryable
:
public interface IRepository<T> where T : class
{
IEnumerable<T> GetAll();
// Expressions!!!! Func will load all items to memeory
// and then perform filtering by linq-to-objects!!!!!!
IEnumerable<T> Find(Expression<Func<T, bool>> where);
T Single(Expression<Func<T, bool>> where);
T First(Expression<Func<T, bool>> where);
void Delete(T entity);
void Add(T entity);
void Attach(T entity);
}
la segunda versión se deriva entonces por las interfaces de repositorio de hormigón que se suman métodos como GetXXXOrderedByName, GetXXXWithRelatedYYY, etc.
Otro punto es que SaveChanges
no es por lo general parte del repositorio, ya que puede que tenga que modificar artículos de múltiples repositorios y guardar los cambios en todos ellos por un único método. Para este propósito existe otro patrón: unidad de trabajo.
'SingleOrDefault()' es un método de extensión de '' IEnumerable –
@Bala R: lo sé, soy mira para una interfaz completa e implementación de todo IObjectSet para poder exponer todos los métodos. – Naor