2009-09-21 38 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查询中使用规范。

相关问题