Методы Specification<T>.And
и Specification<T>.Or
создают Specification<T>
, который принимает экземпляр T
и проверяет его на соответствие логически определенной спецификации.
Так что Specification<T>.And
будет выглядеть примерно так:
public Specification<T> And(Specification<T> left, Specification<T> right) {
return new SpecificationFromPredicate(
t => left.IsSatisfiedBy(t) && right.IsSatisfiedBy(t)
);
}
public class SpecificationFromPredicate<T> : Specification<T> {
private readonly Func<T, bool> predicate;
public SpecificationFromPredicate(Func<T, bool> predicate) {
this.predicate = predicate;
}
public bool IsSatisfiedBy(T t) { return this.predicate(t); }
}
Аналогично для Specification<T>.Or
.
Таким образом, весь смысл в том, что
acceptCustCreditStatusSpec
.And(unlimitedCreditLimitSpec.Or(sufficientCustCreditAmtSpec))
является спецификацией, а с учетом t
он возвращает
acceptCustCreditStatusSpec.IsSatisfiedBy(t) &&
(unlimitedCreditLimitSpec.IsSatisfiedBy(t) ||
sufficientCustCreditAmtSpec.IsSatisifedBy(t)
);