规约模式是一个特别的软件设计模式,业务逻辑可使用boolean逻辑从新连接业务逻辑(维基百科).html
实践中的大部分状况,它是为实体或其它业务对象,定义可复用的过滤器.算法
在查询操做中须要 提供一个逻辑运算表达式,也就是要提供一个返回布尔类型的算法函数。设计模式
在支持lambda表达式的C#的中,这类代码写起来很方便,也很简练。框架
var count = _customerRepository.Count(c => c.Balance > 100000 && c.CreationYear == 2017);
但软件开发中有DRY原则,当一段逻辑在多处代码中出现时,就须要封装一下避免重复拷贝,这就是规约模式的起点。函数
包含一个返回布尔结果的判别逻辑设计
public interface ISpecification<T> { bool IsSatisfiedBy(T obj); }
为了能够在Linq中使用, 这个接口中还要再增长一个返回表达式树的方法。code
public interface ISpecification<T> { bool IsSatisfiedBy(T obj); Expression<Func<T, bool>> ToExpression(); }
须要为这个接口提供一些扩展方法,实现And,Or,Not 和 AndNot从而能够组合规约。htm