解決
としてデイビッドで指摘され、多くの用くださる方々にとって役立つの仕様が可能になり簡潔に表現を実現し、LINQ.
の代わりに新仕様タイプを作成でき任意の仕様によってon-the-fly:GetCustomers().Where(customer => customer.IsActive && customer.City == "Oakland");
これは完全な交換のための仕様では、この理由:
- ソート/フィルタリングが再び起こった際に消費するクラスに帰すべております。を取扱っている場合は以外のものをメモリ内のオブジェ、このレポートは、アンケート(LINQ to SQLにはこの限りではありませんでコンパイル最適化問合せ、実行しているサーバー/リモート側のみ復帰し、ご希望の結果を表します。
- APIは開 他の クエリの場合なコレクションや、仕様にLINQクエリ.したい場合はプロジェクトへの協賛を始め何とができますどのくらい取得する必要がありまセットの仕様を返します。
あわせて利用する必要があらゆる所である可能性がないですので、わからないドメインにいます。
と思うのでアドバイスしない 見 使用します。だときに必要であろうと考えるときの書き込みを開始するクラスの最初の例では、記事にリンクしています。
だって精神的なパターンをリポジトリなのでなんかの請求-お問い合わせはこちら;場合は使用しないでみをすることになりますので必要がなかったためである。
の層の自然の仕様です。多くの場合そのヘルパー支援サービスの層が、場合によって封止ドメイントです。
どのユニット検査、覚えているお客様の仕様は単位が含まれる単位です。テストしていない方法を受け入れる仕様にすべての組み合わせが可能仕様試験仕様にもしていることをご確認ください振る舞いをし、そして再利用できると同じ仕様なので安心して多くの方法。
このビットです。
他のヒント
私は、LINQは、仕様パターンの代替であるとは考えていません。仕様は最高のカプセル化、ビジネスロジックに使用されていることを覚えておいてください。だから私のビジネス要件の一つは、私はいくつかの機能のために、すべての大切なお客様を取得している場合は、私のLINQのステートメントは次のようになります:
var valuedCustomers = Customers.Where(c => c.Orders.Count > 15 && c.Active).ToList();
私は、顧客がいくつかの日の前に参加している必要があること、そのルールに追加したい場合は、私はすべてのアプリケーションが、何の上にこの文を入力することができますか?さて、今私はすべてのアプリケーションの上に移動して、LINQのを変更する必要があります。または(このパターンを使用するための唯一の理由ではありませんが)私のオブジェクトグラフが変更された場合。代わりに、私はちょうどこのような何かを行うことができたとき
var valuedCustomers = Customers.Where(new ValuedCustomerRule.IsSatisfied()).ToList();
私はパターンが繰り返し使用されることに同意しますが、それはそれらのルールが変更されたとき、あなたがかまされませんので、ご使用のシステム全体に現れ、ビジネスルールのために非常に便利です。私にはそれがすべてのアプリケーションのコード上で照会SQLを残すに似ています。
更新の答え: 私は、LINQは、仕様パターンの置き換えではありません、ウィックスに同意します。私はウィックスの答えにコメントを追加するのに十分な評判を持っていない、私はちょうど答えとして返信しています。
としてあたりこの論文の仕様は、主に声明に対するドメインオブジェクトを一致させるために使用されています。仕様は、ドメインオブジェクトに対して一致したときに真/偽のを返すが、その平均値仕様があるんが、 あなたのコード内の任意のブール条件をカプセル化することを提案します。
私はウィックスの答えの上にさらに運ぶでしょう。あなたがValuedCustomer仕様を定義している場合は、使用ルールに異なる働かがあります:
var valuedCustomer = new ValuedCustomerSpecification();
//1. You can use this statement to check if a customer is valued or not in your domain
Customer customer = ....
if(valuedCustomer.IsSatisfiedBy(customer))
//2. You can use it to get just valued customers from repository,
var valuedCustomers = repository.Get(valuedCustomer);
//3. You can combine it with other specifications to create composite specifications. Following syntax can vary with implementation
var seniorValuedCustomer = valuedCustomer.And(seniorCustomer)
紙でから私の理解では、その目的を達成するための仕様書と対話することができ、そのユーザが提供されますそれとアプリのUIがそれを可能にするために必要があります。
上にも、使用しないときの指定パターンに言及した紙を述べています。