の仕様旧式のパターンを利用できる場合の動的LINQ?
-
12-09-2019 - |
質問
Wikipedia 国仕様のパターンがビジネスロジック再結合することができますにチェーンのビジネスロジックをサンプルコードを示します.に関して選択フィルタオブジェからリストは、デスクとなっているように思いるLINQきめ同じものだと言ってもいいです。私何かが足りない?については、その時の仕様のパターンにおいて考慮されるべきでも見ることができますか?
編集:
いくつかにかかって組み合わせLINQの仕様のパターン:
実施の仕様のパターンをLinqによるNicloas Blumhardt(Autofac族)
でもこの道路から複雑なものにな維持?
解決
動的LINQは、動的なクエリの構築を可能にするために、文字列式を使用しています。だから我々は、実際にそこ型の安全性を失います。それ密接に関連化身のDecoratorパターンのようなラッパーパターンを使用してのに対し、仕様パターンは、私たちはコード内で型の安全性を維持することができます。私は再利用し、動的にクエリを構築するために、クエリのラッパーとしてDecoratorパターンを使用して探ります。あなたは、コードプロジェクトの記事を見つけることができます。 LINQのクエリラッパーの
それとも、私のブログを確認することができます。
他のヒント
私はC#の開発者に対しだし、それは私のビジネスドメインの近いため、仕様のパターンを使用するようにしたいです。また、あなたは仕様クラスが存在する場合、それが動作するはずです、このパターンを持つ任意の驚きを持っていません。 LINQのでは、あなたの基になるプロバイダーは多分いくつかの機能を実装していない、とあなたは実行時までそれを知ることができません。
しかし、決定的に、LINQを超える仕様の最大の利点は、ビジネス寄りにあり、それはミニDSLです。私のためのLINQは、コレクションクエリのためではなく、ビジネスドメインのDSLです。
私は本当にLINQを知らないが、一般的には宣言型クエリシステムは、仕様のパターンに関連しているように私には思えます。具体的には、オブジェクト指向の環境で一緒にオブジェクトを構成することによって、宣言照会システムを実現します。 IIRCそれは、シンタックスシュガーの層を設け、LINQが何に似ています。
LINQが完全にパターンを廃止するかどうか、私が言うことができません。多分ちょうどLINQで表現できないコーナーケースがあるのですか?
LINQ:
var oldMans = Persons.Where(x => x.Sex == SexEnum.Masculine && x.Age > 60).ToList();
仕様:
var oldMans = Persons.Where(x => IsOldManSpecification(x)).ToList();
- ビジネスロジックには encapsuledの仕様 (名前ることを明らかになすべき水準にあるといえます。
- ドライ:だけ繰り返すこと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
の responsability かどうかを判断するために彼を受けることができあ信用?銀行お願いしておののいずれかに該当する場合はその氏ができる。
最も適当な説明を選べ。
この仕様を除去することができるロジックからの Customer
(なに所属します。を作成できますように IsAbleToReceiveCreditSpecification
すべての論理である。またさらに、組み合わせの仕様は、例えば:することができる SecureAgeSpecification
や AssetsGreaterThanSpecification
していきたいと考えておりまを構成す IsAbleToReceiveCreditSpecification
.
とは思わないLINQに置き換えの仕様となっています。このパターンです。ある実装の仕様と使用LINQ内部 IQueriable<T>
, この利用できる仕様内ORMに関するお問い合わせリポジトリ/DataAcessます。