El uso del patrón de repositorio no significa que no podrá usar la carga diferida. Todavía puede devolver la entidad que podrá cargar sus entidades relacionadas de forma perezosa. El único requisito es que DbContext
utilizado para cargar la entidad debe estar "vivo".
Pero vamos a echar un vistazo en la definición de repositorio Martin Fowler:
Un repositorio de media entre las capas de dominio y de asignación de datos, actuando como un objeto de dominio colección en memoria. Los objetos del cliente construyen especificaciones de consulta declarativamente y los presentan al Repositorio para satisfacción con . Los objetos pueden ser añadidos a y se retiran del repositorio, como que pueden partir de una simple colección de objetos , y el código de mapeo encapsulado por el repositorio llevar a cabo las operaciones apropiadas detrás de las escenas. Conceptualmente, un Repositorio encapsula el conjunto de objetos persistidos en un almacén de datos y las operaciones realizadas sobre ellos, proporcionando una vista más orientada a objetos de la capa de persistencia. El repositorio también admite el objetivo de logrando una separación limpia y dependencia unidireccional entre el dominio y las capas de mapeo de datos.
Creo que la parte interesante es: cliente objetos construir especificaciones de consulta de forma declarativa, y someterlos a depósito para la satisfacción. También el repositorio generalmente se usa para proporcionar raíces agregadas. Por lo tanto, siempre proporcionará la raíz completa (no siempre es posible) o satisfará la declaración mencionada y definirá la carga ansiosa fuera del repositorio por el método de extensión Include
en IQueryable
. Por eso, nunca necesitará métodos especializados como GetUserByIdIncludeSomething
.
Si desea repositorio de usuarios comenzar con este método para todas las consultas:
public interface IRepository<T>
{
IQueryable<T> GetQuery();
}
BTW. No creo que un usuario sea una raíz agregada para las publicaciones. En tal caso, la mayoría de las aplicaciones tendrán solo una única raíz agregada: un usuario.
Editar:
pequeña aclaración: IQueryable
por defecto no proporciona Include
método.Se proporciona como método de extensión en el ensamblado CTP5, pero si lo usa hará que su capa superior dependa de EntityFramework.dll. Es algo que generalmente no desea (la razón por la que está usando el repositorio). Entonces, el camino a seguir es definir su propio método de extensión envolviendo la extensión proporcionada en el ensamblaje con su repositorio.
No haga esto si desea mantener excepciones relacionadas con datos dentro de su capa de datos. Como la carga diferida se ejecutará en una capa más alta que la que firmarían los directores de arquitectura de cebolla. llevando a todo tipo de comportamiento erróneo. También hay otra razón, simplemente google 'repositorio patrón IQueryable' si desea observar la apasionante argumentación sobre este tema. – Shadetheartist