如果不采用某种查询机制,则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
    }
}
CriteriaOperator.cs

相关文章: