Ich habe die Spezifikation Muster mit Linq umgesetzt wie hier https://www.packtpub.com/article/nhibernate-3-using-linq-specifications-data-access-layer skizzierteMit eifrig Beladung mit Spezifikation Muster
Ich möchte jetzt die Möglichkeit, zu eifrig Last und bin nicht sicher, über den besten Weg, darüber zu gehen hinzuzufügen.
Die generische Repository-Klasse in dem verknüpften Beispiel:
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());
}
und die Spezifikation Umsetzung:
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;
}
}
Diese gut funktioniert, mag ich nun die Möglichkeit, in der eifrigen Last der Lage sein, . Ich verstehe, dass NHibernate eifrig geladen werden kann, indem Sie Fetch für die Abfrage verwenden.
Was ich suchen ist, ob die Eager Ladelogik innerhalb der Spezifikation zu kapseln oder in das Repository zu übergeben, und auch die Linq/Ausdruck Baumsyntax benötigt, um dies zu erreichen (dh ein Beispiel, wie es gemacht würde).
Das ist sicherlich eine Lösung, aber das ist eine Vermischung von Verantwortlichkeiten (Verkapseln von Abfragen und Abrufen von Strategien). Aus diesem Grund ist das Repository-Muster schwach. – jason
Wahr, aber Sie können die Abrufstrategien immer in eine andere Klasse aufteilen oder FetchRelated zu einer Eigenschaft machen, die von einer Service-Schicht gesetzt werden kann. –
@Diego Mijelshon: Was gewinnen wir von dieser Extralebene der Abstraktion? – jason