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