使用IQueryable <T>的设计模式
时间:2020-03-06 14:32:03 来源:igfitidea点击:
随着.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;
我喜欢存储库过滤器模式。它使我们可以将关注点与中间层和数据端层分开,而无需牺牲性能。
数据层可以专注于简单的列表保存保存样式的操作,而中间层可以利用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); }
这是一个简单的示例,但是可以安全地组合使用过滤器以构建更复杂的查询。之所以能够保存性能,是因为直到所有筛选器都已构建到查询中之后,该列表才得以实现。
我喜欢它,因为我不喜欢特定于应用程序的存储库!