Linq-to-SQL、IOC、およびリポジトリパターンを使用したデータのプリフェッチ
-
06-07-2019 - |
質問
Linq-to-SQLを使用して、いくつかのデータをプリフェッチします。
1)一般的な解決策は DataLoadOptions に対処することですが、私のアーキテクチャでは次の理由で機能しません:
- 最初のクエリの前にオプションを設定する必要があります
- IOCを使用しているため、DataContextを直接インスタンス化しません(インスタンス化時にコードを実行できません)
- my DataContextはWebリクエストの期間中持続します
2)データとその子をメソッドにロードし、データのみを返す(子がすでにロードされている)ことに基づく別の可能性を見てきました< a href = "http://www.west-wind.com/weblog/posts/38838.aspx" rel = "nofollow noreferrer">例を参照してください
それでも、私のアーキテクチャでは動作しません:
- クエリはリポジトリからカスケードされ、句を追加する多くのサービスで使用できます
- インターフェイスを操作します。linq-to-sqlオブジェクトの具体的なインスタンスはリポジトリから離れません(はい、インターフェイスを操作して句を追加できます)
- 私のリポジトリは汎用です
はい、このアーキテクチャは静かで複雑ですが、レゴのようなコードで遊ぶことができるのでとてもクールです;)
質問:データをプリフェッチするその他の可能性は何ですか?
解決
私のアプリでは、おそらくあなたの潜在的なソリューション#2のバリエーションを使用しています。説明するのはやや難しいですが、単純に:カスタム遅延クラス。 IQueryable
を利用するLinqToSql固有の差分実行から抽象化します。利点:
- 私のドメインモデルとサービスレイヤーは、必ずしもLinqToSqlプロバイダーに依存する必要はありません(必要に応じてDALをインターフェイスと交換できます)
- My Serviceメソッドは、特定の遅延ロードの実装を抽象化するクラスを使用した遅延ロードのために、複数の「アンカーポイント」を備えた完全なオブジェクトグラフを返すことができます。再度、この回答)
- アプリ全体で
IQueryable
の結果を(必要に応じてUIでも)維持できるため、パフォーマンスを気にせずに無限のLINQクエリチェーンを実現できます。
他のヒント
他の可能性を認識していませんが、LinqToSqlを限界まで押し込んだようです(ただし、間違っているかもしれません)。
現時点での最適なオプションは次のとおりです。
- いくつかの「非汎用」を追加します;あなたのアプリケーションへのメソッドは 積極的な読み込みが必要/不要な特定のシナリオ 「通常」、「汎用」を使用します。それらのメソッドのインフラストラクチャ。
- 熱心で遅延読み込みをより高度にサポートするORMを使用します。
解決策を見つけました。 私の答えは「依存性注入」です。
通常はIOCに同梱されています。つまり、インスタンス化時にIOCコンテナにクラスの注入を管理させることができます。
DCをインスタンス化するときに CustomDCParameter クラスを挿入するだけです。 そのクラスにはルールが含まれ、コンストラクターはそれらすべてを適用します。