Обычно я помещал свои критерии / hql-запросы в класс репозитория / dal, связанный с сущностью, но в последнее время я думал о добавлении еще одной абстракции, которая представляет собой запрос, это дало бы мне возможность добавитьобщее поведение для всех запросов (например, разбиение на страницы) в базовом классе и т. д.
, так что теперь это мои компоненты;
универсальный интерфейс, не связанный с 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; }
}
есть мысли по этому поводу?возможные проблемы, которые вы видите, я мог бы столкнуться?Спасибо!