Normalerweise würde ich meine Kriterien/HQL Abfragen in einem Repository/dal-Klasse im Zusammenhang mit der Entität, aber in letzter Zeit habe ich darüber nachgedacht, eine weitere Abstraktion, was eine Abfrage darstellt, dies würde mir die geben Möglichkeit, allen Abfragen (z. B. Seitennummerierung) in einer Basisklasse allgemeines Verhalten hinzuzufügen.Modellierung NHibernate Abfragen
das sind jetzt meine Komponenten;
generische Schnittstelle nicht zu nhibernate bezogen werden:
public interface IQuery<T>
{
IList<T> List();
T Single();
}
Beispiel Implementierung einer Criteria Abfrage, etwas Ähnliches könnte mit einer HQL-Abfrage oder einer nhibernate-Linq-Abfrage
public abstract class CriteriaQuery<T>: IQuery<T>
{
[Inject]
public ISessionFactory SessionFactory { protected get; set; }
protected ISession Session
{
get { return SessionFactory.GetCurrentSession(); }
}
protected abstract ICriteria Configure(ICriteria criteria);
[Transaction]
public virtual IList<T> List()
{
var criteria = Session.CreateCriteria(typeof (T));
return Configure(criteria)
.List<T>();
}
[Transaction]
public virtual T Single()
{
return Configure(Session.CreateCriteria(typeof(T)))
.UniqueResult<T>();
}
}
und getan wird Hier würde eine domänenspezifische Abfrage wie folgt aussehen:
public interface IGetVideosQuery: IQuery<Video>
{
IGetVideosQuery Page(int index);
IGetVideosQuery PageSize(int pageSize);
IGetVideosQuery AllTime { get; }
IGetVideosQuery Today { get; }
IGetVideosQuery LastWeek { get; }
}
any Gedanken dazu? mögliche Probleme, auf die ich stoßen könnte? Danke!
Check out Fabio Maulo 'erweiterte' Abfrage-Objekt für ein etwas verwandtes Konstrukt: http://fabiomaulo.blogspot.com/2010/07/enhanced-query-object.html – DanP
@ danp: danke dafür! –