2009-09-21 11 views
7

Wikipediaは、仕様パターンは、ブール論理を使用してビジネスロジックを連鎖させることによってビジネスロジックを再結合できる場所であると述べています。リストまたはコレクションからフィルタリングオブジェクトを選択することに関しては、Dynamic LINQを使って同じことを達成できるように思えます。何か不足していますか?仕様パターンには他の利点もありますか?ダイナミックLINQを使用できる場合、仕様パターンは廃止されていますか?


編集:

Linq Specifications Project

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

は、誰もがこの道を行ってとやってしまった:私は、LINQと仕様のパターンを組み合わせて議論するいくつかの記事を見つけた

それは維持するために複雑になる?

+0

私は今この厳しい状況に直面しているので、この質問は私にとって大きな関心事です。 –

答えて

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(); 
  • ビジネスロジックは、(それが何であるかを明らかにした名前を持つ)仕様にencapsuled あります。
  • DRY:あなたはちょうど

は私がルールは、コード内の明示的なことを十分に重要であることを考えるときの仕様を使用するように仕様を使用して、コードの上にそのLINQを繰り返しませんが、エンティティに属していません。

例:それは、彼はいくつかのクレジットを受け取ることができるかどうかを判断するためにCustomerresponsabilityから

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から削除することができます(それは決してそれに属しません)。 IsAbleToReceiveCreditSpecificationのようなものを作成し、すべてのロジックをそこに置くことができます。たとえば、SecureAgeSpecificationAssetsGreaterThanSpecificationを作成し、それを使用してIsAbleToReceiveCreditSpecificationを作成すると、仕様を組み合わせて仕様を組み合わせることができます。

だから、LINQが仕様を置き換えるとは思わない。実際にはパターンを改善します。 IQueriable<T>でLINQを内部的に使用する仕様の実装がいくつかあります。これにより、Repository/DataAcessレベルでORMクエリ内の仕様を使用できます。

関連する問題