-->

是规范模式已经过时的时候可以使用动态LINQ?(Is the Specification Patte

2019-08-08 09:03发布

维基百科指出规格的图案存在于业务逻辑可以通过使用布尔逻辑链接业务逻辑一起复合。 对于选择从列表或集合过滤对象似乎对我来说,动态LINQ可以让我完成同样的事情。 我缺少的东西吗? 是应该考虑的,以及在规范模式还有其他的好处?


编辑:

我发现一些职位,讨论相结合LINQ和规格模式:

LINQ的指标项目

通过Nicloas Blumhardt(Autofac哥们)执行经由LINQ的说明书模式

有没有人去了哪里做这条道路并没有它变得复杂维护?

Answer 1:

动态LINQ使用字符串表达式允许动态查询建设。 所以我们实际上失去的类型安全存在。 而使用喜欢它的Decorator模式密切相关的化身,规格图案包装图案,使我们能够保持代码的类型安全。 我探索使用装饰图案作为查询的包装,以重用和动态建立查询。 您可以在代码项目的文章: LINQ查询包装器

或者你可以检查我的博客 。



Answer 2:

我是一个C#developper,喜欢使用该规范的模式,因为它是我的业务领域的更紧密。 此外,你没有这种模式的任何意外,如果规范类存在,它应该工作。 使用LINQ,您的潜在供应商,也许还没有实现的一些功能,你会不会发现,直到运行时。

但是明确,在LINQ规范的最大的好处就是更贴近业务,这是一个小型的DSL。 LINQ对我来说是收集查询DSL,而不是商业领域。



Answer 3:

我不知道LINQ真的,但在我看来,在一般的声明查询系统是关系到规范的模式。 特别地,实施通过以面向对象的环境中的对象构成在一起的声明性查询系统。 IIRC这是类似于什么LINQ做,提供的语法糖层。

无论LINQ完全淘汰了模式,我不能告诉。 也许有,只是不能在LINQ表达极端情况?



Answer 4:

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 ,并把所有的逻辑在那里。 我们可以走得更远,并结合规格,例如:你可以创建一个SecureAgeSpecificationAssetsGreaterThanSpecification ,并用它们来组成IsAbleToReceiveCreditSpecification

所以,我不认为LINQ取代了规范。 事实上,它提高了模式。 有规范的一些实现使用LINQ内部与IQueriable<T>这个你可以在存储库/ DataAcess级使用ORM查询里面的规范。



文章来源: Is the Specification Pattern obsolete when you can use Dynamic LINQ?