2011-08-23 43 views
0

我相信這更多是一個繼承性問題,但因爲我試圖通過實現一個使用它的模式來更好地理解它,所以我想我會問我的相關問題得到一個更好的把握。需要幫助瞭解規範模式 - 繼承

如果使用Specification Pattern,有大量的規範,從規範的所有推導和你的包裝規範類包起來:

例子:

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方法?

謝謝,

回答

1

Specification<T>.AndSpecification<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) 
    );