随着.NET 3.5和IQueryable
界面的引入,将出现新的模式.虽然我已经看到了规范模式的许多实现,但我还没有看到使用这种技术的许多其他模式.Rob Conery的Storefront应用程序是另一个使用IQueryable
它可能导致一些新模式的具体示例.
有用的IQueryable
界面出现了什么样的模式?
它确实使得存储库模式也更容易实现.您基本上可以创建一个通用存储库:
public class LinqToSqlRepository : IRepository { private readonly DataContext _context; public LinqToSqlRepository(DataContext context) { _context = context; } public IQueryableFind () { return _dataContext.GetTable (); // linq 2 sql } /** snip: Insert, Update etc.. **/ }
然后将它与linq一起使用:
var query = from customers in _repository.Find() select customers;
我喜欢存储库过滤器模式.它允许您在不牺牲性能的情况下将问题从中间层和数据端层分离出来.
您的数据层可以专注于简单的list-get-save样式操作,而您的中间层可以利用IQueryable的扩展来提供更强大的功能:
存储库(数据层):
public class ThingRepository : IThingRepository { public IQueryableGetThings() { return from m in context.Things select m; // Really simple! } }
过滤(服务层):
public static class ServiceExtensions { public static IQueryableForUserID(this IQueryable qry, int userID) { return from a in qry where a.UserID == userID select a; } }
服务:
public GetThingsForUserID(int userID) { return repository.GetThings().ForUserID(userID); }
这是一个简单的示例,但可以安全地组合过滤器以构建更复杂的查询.保存性能是因为在将所有过滤器内置到查询中之前,列表未实现.
我喜欢它,因为我不喜欢特定于应用程序的存储库!