如果不采用某种查询机制,则Repository将充斥着大量的检索方法。
public interface ICustomerRepository { IEnumerable<Customer> FindAll(); IEnumerable<Customer> FindAllVIPCustomers(); IEnumerable<Customer> FindByOrder(Guid ID); IEnumerable<Customer> FindAllCustomersThatHaveOutstandingOrders(); …… }
如果采用了Query Object模式,就能够构造出任意查询,然后传给Repository。
Query Object模式的主要好处是它完全的将底层的数据库查询语言抽象出来,因此将数据持久化和检索的基础设施的关注点从业务层中分离出来。但有时候,需要创建原始的数据库查询语言。这可以通过使用数据库特有的QueryTranslator(传入Query Object参数并将其转换成数据库语言)来实现。
namespace Chap7.QueryObject.Infrastructure { //在这个demo中,只定义如下的几个操作,如果需要更多的操作,还需要额外的定义它们 public enum CriteriaOperator { Equal, LessThanOrEqual, NotApplicable } }