2010-08-01 20 views
5

Solía ​​usar NHibernate con interfaces de repositorio.Patrón de repositorio con Entity Frameworks 4

¿Cuál es la forma correcta de utilizar este patrón con EF?
¿Cómo puedo implementar esta interfaz de repositorio, para un RepositoryBase<T>?

public interface IRepository<T> 
{ 
    T GetById(object id); 
    void Save(T entity); 
    T[] GetAll(); 
    void Delete(T entity); 
} 

Respuesta

0

Existen varios enfoques (la mayoría de ellos son bastante similares y solo difieren un poco), por lo que le recomendaría investigar y elegir el que más le convenga.

Con EF 4 es posible implementar un repositorio genérico usando ObjectSet<T>. Echar un vistazo a algunos artículos que podrían ayudar:

http://devtalk.dk/2009/06/09/Entity+Framework+40+Beta+1+POCO+ObjectSet+Repository+And+UnitOfWork.aspx

http://www.forkcan.com/viewcode/166/Generic-Entity-Framework-40-Base-Repository

0

que básicamente tienen sus repositorios hablar yo el contexto del objeto. Sólo cambio yo haría sería tener su GetAll devuelve un IEnumerable en lugar algo así como:

public class SomeObjectRepo : IRepository<SomeObject> 
{ 
    SomeContext GetById(object id) 
    { 
     using(var context = new MyContext()) 
     { 
      return context.SomeObjects.First(x=>x.id.Equals(id)); 
     } 
    } 

etc... 
} 
2

Por alguna razón, todos los ejemplos presentados exponen las colecciones como IQueryable o IEnumerable. EF4 tiene una interfaz para este propósito: IObjectSet (o IDbSet si está utilizando el último CTP).

Julie Lerman tiene un tremendo mensaje sobre cómo hacer esto, incluyendo la creación de un MockSet que implementa IObjectSet, por lo que se puede hacer algunas pruebas de unidad desconectada

http://thedatafarm.com/blog/data-access/agile-entity-framework-4-repository-part-6-mocks-amp-unit-tests/

+0

Parece que IObjectSet es específico de EF y, por lo tanto, no me gustaría en un patrón de repositorio. El punto es que no quieres que tu contenedor Irepository tenga dependencia de EF – Gluip

Cuestiones relacionadas