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>.Andandメソッドは、のインスタンスを取得し、論理的に定義された仕様に対してテストする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)
    );
于 2011-08-23T21:04:47.660 に答える