Ответ 1
Это зависит.:)
Мое мнение:
Мне нравится держать мою службу свободной, чтобы свести к минимуму дубликат кода. Я также являюсь поклонником труб и фильтров.
Вот что я сделал бы (и делаю так).
Сервис
public ICollection<Item> GetHandledItems<TKey>(OrderingOptions<Item, TKey> orderingOptions)
{
return repository
.Query()
.WhereHandled()
.WithOrdering(orderingOptions)
.ToList();
}
ItemFilters.cs
public static IQueryable<Item> WhereHandled(this IQueryable<Item> source)
{
return source.Where(it => it.IsHandled);
}
public static IOrderedQueryable<T> WithOrdering<T, TKey>(
this IQueryable<T> source,
OrderingOptions<T, TKey> orderingOptions)
{
return orderingOptions.SortDescending
? source.OrderByDescending(orderingOptions.OrderingKey) :
source.OrderBy(orderingOptions.OrderingKey);
}
OrderingOptions.cs
public class OrderingOptions<T,TKey>
{
public OrderingOptions(Expression<Func<T,TKey>> orderingKey, bool sortDescending = false)
{
OrderingKey = orderingKey;
SortDescending = sortDescending;
}
public Expression<Func<T,TKey>> OrderingKey { get; private set; }
public bool SortDescending { get; private set; }
}
Таким образом, вы можете указать порядок в контроллере:
var items = service.GetHandledItems(new OrderingOptions(it => it.Id));
Различия между приведенными выше и опциями 3:
- Выше материализуется последовательность перед возвратом в контроллер. Вариант 3 не является опасным (вы можете завершить запрос для просмотра и разлома шаблона MVC).
- Общий "Заказ" POCO может использоваться в любом месте и хранит ваши запросы D-R-Y.
- Сервис становится немой, и просто является помощником между репозиторием и контроллером (что все, что он должен делать, IMO). Логика (например, фильтры) абстрагирована в одном месте.
НТН