通常我会将我的条件/HQL查询放在与实体相关的存储库/DAL类中,但最近我考虑添加另一个表示查询的抽象层,这将使我有可能在基类中添加所有查询的通用行为(例如分页)等。
因此,现在我的组件如下:
不涉及nhibernate的通用接口:
因此,现在我的组件如下:
不涉及nhibernate的通用接口:
public interface IQuery<T>
{
IList<T> List();
T Single();
}
这是一个基于Criteria查询的示例实现,类似的操作也可以通过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; }
}
你对此有什么想法?你认为我可能会遇到哪些问题吗? 谢谢!