通常我会把我的标准/ hql查询放入与实体相关的存储库/ dal类中,但最近我一直在考虑添加另一个表示查询的抽象,这会给我在基类中的所有查询(例如分页)中添加普通行为的可能性等。建模NHibernate查询
所以这些是我现在的组件;
通用接口不相关的NHibernate:
public interface IQuery<T>
{
IList<T> List();
T Single();
}
例实施基于标准的查询,也可能出现相似的HQL查询,或NHibernate的,LINQ查询
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>();
}
}
并做了什么这里一个特定领域的查询将如下所示:
public interface IGetVideosQuery: IQuery<Video>
{
IGetVideosQuery Page(int index);
IGetVideosQuery PageSize(int pageSize);
IGetVideosQuery AllTime { get; }
IGetVideosQuery Today { get; }
IGetVideosQuery LastWeek { get; }
}
任何对此有何想法?您可能遇到的问题可能会遇到? 谢谢!
查看Fabio Maulo的“增强型”查询对象,查看某个相关的结构:http://fabiomaulo.blogspot.com/2010/07/enhanced-query-object.html – DanP 2010-10-25 12:34:29
@danp:谢谢! – 2010-10-25 12:43:43