Шаблоны проектирования с использованием IQueryable <T>
С введением интерфейса .NET 3.5 и IQueryable<T>
появятся новые шаблоны. Хотя я видел ряд реализаций шаблона Specification, я не видел много других шаблонов, использующих эту технологию. Приложение Rob Conery Storefront является еще одним конкретным примером, использующим IQueryable<T>
, который может привести к появлению новых шаблонов.
Какие шаблоны появились из полезного интерфейса IQueryable<T>
?
Ответы
Ответ 1
Это, безусловно, упростило реализацию шаблона репозитория. Вы можете создать общий репозиторий:
public class LinqToSqlRepository : IRepository
{
private readonly DataContext _context;
public LinqToSqlRepository(DataContext context)
{
_context = context;
}
public IQueryable<T> Find<T>()
{
return _dataContext.GetTable<T>(); // linq 2 sql
}
/** snip: Insert, Update etc.. **/
}
а затем используйте его с linq:
var query = from customers in _repository.Find<Customer>()
select customers;
Ответ 2
Мне нравится шаблон репозитория-фильтра. Это позволяет отделять проблемы от среднего и конечного уровней данных, не жертвуя производительностью.
В вашем слое данных можно сосредоточиться на простых операциях стиля 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);
}
Это простой пример, но фильтры можно безопасно комбинировать для создания более сложных запросов. Производительность сохраняется, потому что список не материализуется, пока все фильтры не будут встроены в запрос.
Мне это нравится, потому что мне не нравятся репозитории, специфичные для приложений!