0

我相信这更像是一个继承问题,但是由于我试图通过实现使用它的模式来更好地掌握它,我想我会问我的相关问题以便更好地掌握。

如果您使用规范模式,有许多规范都派生自规范,并用包装规范类包装它们:

例子 :

public class CustomerCreditCheck : Specification<Customer> {
    private readonly UnlimitedCreditLimitSpecification unlimitedCreditLimitSpec = new UnlimitedCreditLimitSpecification();
    private readonly SufficientCustomerCreditAmountSpec sufficientCustCreditAmtSpec = new SufficientCustomerCreditAmountSpec();
    private readonly AcceptableCustomerCreditStatusSpecification acceptCustCreditStatusSpec = new AcceptableCustomerCreditStatusSpecification();

    public override bool IsSatisfiedBy(Customer customer) {

        return acceptCustCreditStatusSpec
               .And(unlimitedCreditLimitSpec.Or(sufficientCustCreditAmtSpec))
               .IsSatisfiedBy(customer);
    }
}

我的问题是:既然您将客户实体传递给 acceptCustCreditStatusSpec 的 IsSatisfiedBy 方法(第一个假设),那么客户实体如何传递给 unlimitedCreditLimitSpec 和 SufficientCustCreditAmtSpec 规范的 IsSatisifedBy 方法?

谢谢,

4

1 回答 1

1

Specification<T>.AndandSpecification<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)
    );
于 2011-08-23T21:04:47.660 回答