2010-12-07 72 views
6

我正在爲我們的部門之一提供數據驗證實用程序,該部門有以下要求。 - 動態添加新的業務實體 - 動態地向實體添加新的驗證。 - 用於顯示業務實體清單及其有效性的UI - 用戶可以選擇開始對所有或選定的業務實體有效性進行驗證。 - 如果任何驗證失敗,UI將顯示驗證錯誤消息。 - 即使任何驗證失敗,系統仍應繼續進行下一次驗證,因此所有已配置的validaiton都將得到驗證。驗證設計模式

在搜索互聯網後,我發現以下2個promissing設計模式,滿足我的業務需求一個id裝飾模式,另一個是命令鏈(又名責任鏈)。現在我的問題是哪個更好?任何人有更好的主意?

感謝

+0

我想你可能需要改寫你的問題。你能否清楚你想要做什麼,比如說命令鏈模式? – 2010-12-07 12:54:33

回答

7

我想你想要什麼Specification Pattern。所以,你會做這樣的事情:

public void StartDateNotInPastSpecification : ISpecification<ISomeBusinessObject> 
{ 
    public bool IsSatisfiedBy(ISomeBusinessObject myBusinessObject) 
    { 
    return myBusinessObject.StartDate >= DateTime.Now; 
    } 
} 

關於這個模式的好處是,每個規則是孤立容易測試和你選擇何時應用驗證規則(相對於一些框架,其承擔這一決定你)。

4

我也在使用規範模式。這是它的基本實現。

public class Specification<T, E> : ISpecification<T, E> 
{ 
    private Predicate<T> predicate; 

    public Specification(Predicate<T> predicate) 
    { 
     this.predicate = predicate; 
    } 

    public bool IsSatisfiedBy(T candidate) 
    { 
     return this.predicate.Invoke(candidate); 
    } 
} 

利用此實現,我只是通過一個謂語在構造函數中,像這樣:

var specification = new Specification<SomeDomainClass>(x => x.SomeDomainBoolMethod()); 

而不是幾個班(每每個條件在我的域名),我有幾個布爾方法我的業務對象。

+0

您能否添加/重寫樣本使用代碼以包含更多解釋性的類/方法名稱? – 2018-01-18 08:55:46