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