he implementado el modelo de especificación con LINQ como se describe aquí https://www.packtpub.com/article/nhibernate-3-using-linq-specifications-data-access-layerUsando carga ansiosos con el patrón de especificación
ahora quiero añadir la capacidad de carga con ganas y estoy seguro sobre la mejor manera de hacerlo.
La clase repositorio genérico en el ejemplo enlazado:
public IEnumerable<T> FindAll(Specification<T> specification)
{
var query = GetQuery(specification);
return Transact(() => query.ToList());
}
public T FindOne(Specification<T> specification)
{
var query = GetQuery(specification);
return Transact(() => query.SingleOrDefault());
}
private IQueryable<T> GetQuery(
Specification<T> specification)
{
return session.Query<T>()
.Where(specification.IsSatisfiedBy());
}
Y la aplicación de especificación:
public class MoviesDirectedBy : Specification<Movie>
{
private readonly string _director;
public MoviesDirectedBy(string director)
{
_director = director;
}
public override
Expression<Func<Movie, bool>> IsSatisfiedBy()
{
return m => m.Director == _director;
}
}
Esto está funcionando bien, ahora quiero añadir la habilidad de ser capaz de cargar con ganas . Entiendo que la carga ansiosa de NHibernate se puede hacer usando Fetch en la consulta.
Lo que estoy buscando es si encapsular la lógica de carga ansiosa dentro de la especificación o pasarla al repositorio, y también la sintaxis del árbol de expresiones/Linq requerida para lograr esto (es decir, un ejemplo de cómo se haría))
Sin duda es una solución, pero eso es una mezcla de responsabilidades (encapsulando las estrategias de consulta y recuperación). Esta es la razón por la cual el patrón de repositorio es débil. – jason
Es cierto, pero siempre puede separar las estrategias de búsqueda en otra clase, o hacer que FetchRelated sea una propiedad que puede ser configurada por una capa de servicio. –
@ Diego Mijelshon: ¿Qué estamos obteniendo de ese nivel extra de abstracción? – jason