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查詢中使用規範。
我現在幾乎面對這種確切的情況,所以這個問題對我很感興趣。 – 2009-09-21 19:24:42