Нужна помощь в понимании шаблона спецификации - наследование - PullRequest
0 голосов
/ 24 августа 2011

Я считаю, что это скорее вопрос наследования, но, поскольку я пытаюсь понять его лучше, применяя шаблон, в котором он используется, я решил задать свой вопрос, связанный с этим, чтобы лучше понять.

Если вы используете шаблон спецификации , имеющий ряд спецификаций, все вытекающие из спецификации, и вы заключаете их в класс спецификации оболочки:

Пример:

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);
    }
}

У меня такой вопрос: поскольку вы передаете сущность клиента в метод IsSatisfiedBy acceptCustCreditStatusSpec (первое предположение), как сущность клиента передается методу IsSatisifedBy как спецификаций unlimitedCreditLimitSpec и SufficientCustCreditAmtSpec?

Спасибо

1 Ответ

1 голос
/ 24 августа 2011

Методы 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)
    );
...