Мне нравится шаблон фильтра репозитория. Это позволяет отделить задачи от среднего и конечного уровня данных без ущерба для производительности.
Ваш уровень данных может концентрироваться на простых операциях стиля list-get-save, в то время как ваш средний уровень может использовать расширения IQueryable для обеспечения более надежной функциональности:
Репозиторий (слой данных):
public class ThingRepository : IThingRepository
{
public IQueryable<Thing> GetThings()
{
return from m in context.Things
select m; // Really simple!
}
}
Фильтр (Сервисный слой):
public static class ServiceExtensions
{
public static IQueryable<Thing> ForUserID(this IQueryable<Thing> qry, int userID)
{
return from a in qry
where a.UserID == userID
select a;
}
}
Услуги:
public GetThingsForUserID(int userID)
{
return repository.GetThings().ForUserID(userID);
}
Это простой пример, но фильтры можно безопасно комбинировать для создания более сложных запросов. Производительность сохраняется, поскольку список не материализуется, пока все фильтры не будут встроены в запрос.
Мне это нравится, потому что мне не нравятся репозитории для конкретных приложений!