J'ai mis en œuvre le modèle de cahier des charges avec LINQ comme indiqué ici https://www.packtpub.com/article/nhibernate-3-using-linq-specifications-data-access-layerEn utilisant le chargement désireux avec motif de spécification
Je veux maintenant ajouter la capacité de charge avide et ne suis pas sûr de la meilleure façon de s'y prendre.
La classe de référentiel générique dans l'exemple lié:
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());
}
et la mise en œuvre des spécifications:
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;
}
}
Cela fonctionne bien, je veux maintenant ajouter la capacité d'être en mesure de charger désireux . Je comprends NHibernate chargement impatient peut être fait en utilisant Fetch sur la requête. Ce que je cherche est d'encapsuler la logique de chargement impatiente dans la spécification ou de la passer dans le référentiel, ainsi que la syntaxe Linq/arbre d'expression nécessaire pour atteindre cet objectif (un exemple de comment cela serait fait).
C'est certainement une solution, mais c'est un mélange de responsabilités (encapsulation des stratégies d'interrogation et de récupération). C'est pourquoi le modèle de référentiel est faible. – jason
Vrai, mais vous pouvez toujours séparer les stratégies de récupération dans une autre classe ou faire de FetchRelated une propriété qui peut être définie par une couche de service. –
@Diego Mijelshon: Que gagnons-nous de ce niveau d'abstraction supplémentaire? – jason