随着 .NET 3.5 和IQueryable<T>
接口的引入,将会出现新的模式。虽然我已经看到了规范模式的许多实现,但我还没有看到使用这种技术的许多其他模式。Rob Conery 的 Storefront 应用程序是另一个具体示例,使用IQueryable<T>
它可能会导致一些新模式。
IQueryable<T>
从有用的界面中出现了哪些模式?
随着 .NET 3.5 和IQueryable<T>
接口的引入,将会出现新的模式。虽然我已经看到了规范模式的许多实现,但我还没有看到使用这种技术的许多其他模式。Rob Conery 的 Storefront 应用程序是另一个具体示例,使用IQueryable<T>
它可能会导致一些新模式。
IQueryable<T>
从有用的界面中出现了哪些模式?
它当然也使存储库模式更易于实现。您基本上可以创建一个通用存储库:
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;
我喜欢存储库过滤器模式。它允许您在不牺牲性能的情况下将关注点与中间层和数据端层分开。
您的数据层可以专注于简单的 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);
}
这是一个简单的示例,但可以安全地组合过滤器来构建更复杂的查询。性能得到了保存,因为在所有过滤器都内置到查询中之前列表没有具体化。
我喜欢它,因为我不喜欢特定于应用程序的存储库!