趣味编程:C#中Specification模式的实现(参考答案 - 上)
2010-09-30 21:02:07 来源:WEB开发网嗯嗯,这也是一种依赖注入。在普通的面向对象语言中,承载一段逻辑的最小单元只能是“类”,只是我们说,某某类中的某某方法就是我们需要的逻辑。而在C#中,从最早开始就有“委托”这个东西可用来承载一段逻辑。与其为每种情况定义一个特定的Specification类,让那个 Spcification类去访问外部资源(即建立依赖),不如我们将这个类中唯一需要的逻辑给准备好,各种依赖直接通过委托由编译器自动保留,然后直接注入到一个“通用”的类中。很关键的是,这样在编程方面也非常容易。
至于原本ISpecification<T>中的And,Or,Not方法,我们可以将它们提取成扩展方法。有朋友说,既然有了扩展方法,那么对于一些不需要访问私有成员/状态的方法,都应该提取到实体的外部,避免“污染”实体。不过我不同意,在我看来,到底是用实例方法还是扩展方法,还是个根据职责和概念而一定的。我在这里打算使用扩展的目的,是因为And,Or,Not并非是一个Specification对象的逻辑,并不是一个Specification对象说,“我要去And另一个”,“我要去Or另一个”,或者“我要造……取反”。就好比二元运算符&&、||、或者+、-,左右两边的运算数字有主次之分吗?没有,它们是并列的。因此,我选择使用额外的扩展方法,而不是将这些职责交给某个Specification对象:
public static class SpecificationExtensions
{
public static ISpecification<T> And<T>(
this ISpecification<T> one, ISpecification<T> other)
{
return new Specification<T>(candidate =>
one.IsSatisfiedBy(candidate) && other.IsSatisfiedBy(candidate));
}
public static ISpecification<T> Or<T>(
this ISpecification<T> one, ISpecification<T> other)
{
return new Specification<T>(candidate =>
one.IsSatisfiedBy(candidate) || other.IsSatisfiedBy(candidate));
}
public static ISpecification<T> Not<T>(this ISpecification<T> one)
{
return new Specification<T>(candidate => !one.IsSatisfiedBy(candidate));
}
}
Tags:趣味 编程 Specification
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接