2009-04-12 18 views
12

Soy nuevo en el patrón de repositorio y después de leer mucho en la web tengo una comprensión aproximada de lo que está sucediendo, pero parece haber un conflicto de ideas.Patrón de repositorio: ¿POCO o IQueryable?

Uno es lo que debe devolver el IRepository.

me gustaría tratar en SOLAMENTE Pocos por lo que tendría una aplicación IRepository para cada raíz agregada, así:

public class OrangeRepository: IOrangeRepository 
{ 
    public Orange GetOrange(IOrangeCriteria criteria); 
} 

donde IOrangeCriteria toma una serie de argumentos específicos para la búsqueda de una naranja.

La otra cosa que tengo es un número de back-ends de datos, por eso me metí en este patrón en primer lugar. Me imagino que tendré una implementación para cada uno, por ejemplo

OrangeRepositoryOracle, OrangeRepositorySQL, OrangeRepositoryMock etc

me gustaría mantenerlo abierto para que pudiera utilizar EF o NHibernate - de nuevo si mis ofertas IOrangeRepository en Pocos entonces encapsularía esto dentro del repositorio mismo, implementando un OrangeRepositoryNHibernate, etc.

¿Estoy en las líneas correctas?

Gracias

EDIT: Gracias por los comentarios, no tengo a nadie más a rebotar fuera de estas ideas en el momento por lo que es apreciado!

Respuesta

9

Sí, su versión es la más segura/más compatible. Todavía puede usarlo con cualquier recurso, no solo con acceso a datos, sino con servicios web, archivos, lo que sea.

Tenga en cuenta que con la versión IQueryable todavía puede trabajar en función de sus clases de POCO, pero está vinculado a IQueryable. Además, tenga en cuenta que podría estar teniendo un código que use IQueryable y luego resulte que se trata de un caso en el que uno de los ORM del repositorio no lo maneja bien.

5

Uso el mismo patrón que tú. Me gusta mucho. Puede obtener sus datos de cualquier recurso.

Pero la ventaja de usar IQuerable es que no tiene que codificar su propia API de criterios como el OrangeCriteria.

Cuando NHibernate recibe soporte completo de Linq, entonces puedo cambiar a IQueryable.

Entonces usted consigue

public class OrangeRepository: IOrangeRepository { 
    public IQueryable<Orange> GetOranges(); 
} 
Cuestiones relacionadas