2009-09-21 82 views
7

Wikipedia指出規範模式是通過使用布爾邏輯將業務邏輯鏈接在一起來重組業務邏輯的地方。關於從列表或集合中選擇過濾對象,在我看來動態LINQ允許我完成同樣的事情。我錯過了什麼嗎?規範模式是否還有其他好處也應該考慮?當您可以使用動態LINQ時,規範模式是否已過時?


編輯:

我發現一些職位,商量合併LINQ和規格模式:

Linq Specifications Project

Implementing the Specification Pattern via Linq by Nicloas Blumhardt (Autofac dude)

有沒有人去了哪裏做了這條路,做維護變得複雜了?

+0

我現在幾乎面對這種確切的情況,所以這個問題對我很感興趣。 – 2009-09-21 19:24:42

回答

2

動態LINQ使用字符串表達式來允許動態查詢構造。所以我們確實在那裏失去了類型安全。儘管使用類似裝飾器模式的包裝器模式與規範模式緊密相關,但它使我們能夠在代碼中保持類型安全。我探索使用裝飾模式作爲查詢包裝,以重用和動態構建查詢。您可以在代碼項目的文章: Linq Query Wrappers

或者你可以檢查我的blog

5

我是C#開發人員,喜歡使用規範模式,因爲它更接近我的業務領域。此外,如果規範類存在,則對此模式沒有任何意外,它應該可以工作。有了Linq,你的底層提供者可能還沒有實現一些功能,直到運行時纔會知道它。

但是,明確地說,與LINQ相比,規範的最大優勢在於更接近業務,它是一個迷你DSL。對於我來說,LINQ是一個用於收集查詢的DSL,而不是用於業務領域。

1

我真的不知道LINQ,但在我看來,聲明性查詢系統通常與規範模式有關。特別是,通過在面向對象的環境中組合對象來實現聲明性查詢系統。 IIRC類似於LINQ的功能,提供了一層語法糖。

LINQ是否完全過時了模式,我說不出來。也許有一些不能在LINQ中表達的角落案例?

0

LINQ:

var oldMans = Persons.Where(x => x.Sex == SexEnum.Masculine && x.Age > 60).ToList(); 

規格:

var oldMans = Persons.Where(x => IsOldManSpecification(x)).ToList(); 
  • 業務邏輯是在規範微膠囊(使用一個名稱,揭示它是什麼)。
  • DRY:你不要再講了LINQ的代碼,你只需要使用規範

我喜歡用規範時,我認爲要在代碼中明確規則是足夠重要的,但它不屬於實體

例子:

public class Customer 
{ 
    //... 

    public bool IsAbleToReceiveCredit(decimal creditValue) 
    { 
     var secureAge = this.Age > 18 && this.Age < 60; 
     var personalAssetsGreaterThanCreditValue = this.PersonalAssets.Sum(x => x.Value) > creditValue; 

     return secureAge && personalAssetsGreaterThanCreditValue; 
    } 
} 

Customer責任是它來決定,如果他能夠獲得一定的信用?

可能不是。

因此,通過規範,您可以從Customer中刪除該邏輯(它從來不屬於它)。您可以創建類似IsAbleToReceiveCreditSpecification的東西,並將所有邏輯放在那裏。我們可以進一步結合規範,例如:您可以創建一個SecureAgeSpecification和一個AssetsGreaterThanSpecification並使用它們組成IsAbleToReceiveCreditSpecification

所以我不認爲LINQ取代規範。實際上它改進了模式。有一些規範的實現在內部使用LINQ IQueriable<T>,您可以在存儲庫/數據訪問級別的ORM查詢中使用規範。

相關問題