Я реализовал шаблон спецификации с Linq, как описано здесь https://www.packtpub.com/article/nhibernate-3-using-linq-specifications-data-access-layerИспользования жадной загрузки с спецификацией шаблоном
Теперь я хочу, чтобы добавить возможность нетерпеливых нагрузок и не уверен, о лучшем способе пойти об этом.
Общий класс хранилища в связанном, например:
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());
}
И реализации спецификации:
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;
}
}
Это работает хорошо, теперь я хочу, чтобы добавить возможность быть в состоянии нетерпеливого нагрузки , Я понимаю, что загрузка NHibernate может быть выполнена с использованием Fetch по запросу.
Я ищу, нужно ли инкапсулировать загружаемую логику загрузки в спецификацию или передать ее в репозиторий, а также синтаксис дерева Linq/expression, необходимый для достижения этого (например, пример того, как это будет сделано).
Это, безусловно, решение, но это смешение обязанностей (инкапсуляция запросов и выборка стратегий). Вот почему шаблон репозитория слаб. – jason 2010-12-06 16:27:54