復号化レイヤーを備えた LINQ-to-SQL を使用した oData/ADO.NET データ サービス
-
27-09-2019 - |
質問
LINQ-to-SQL を使用して、Web フォームをデータベースに送信するアプリケーションを作成しました。リポジトリ パターンを使用して LINQ-to-SQL を抽象化します。
このリポジトリには次の基本的なメソッドがあります。Get()、Save() など。
プロジェクトの開発として、フォーム内の特定のフィールドを暗号化する必要がありました。リポジトリの Get() メソッドと Save() メソッドに暗号化呼び出しを追加しただけなので、これは簡単なことでした。
ここで、MS Excel 2010 (リリース時に) から RESTful 抽出できるように、その上に oData レイヤーを置きたいと思います。役に立たないエラーメッセージなどでいくつかつまずいた後、私はこれで動作しています。
ただし、明らかに、これらの暗号化されたフィールドは依然として暗号化されています。私のリポジトリ パターンでは、これらを復号化できます。私の知る限り、oData サービスをスキーマなどの LINQ-to-SQL コンテキストに直接バインドする必要があります。私が苦痛の世界に入らない限り、仕事をすることはできません(どんなURLでも歓迎です)。
暗号化/復号化レイヤーをリクエストに挿入して、復号化が「オンザフライ」で行われるようにする方法はありますか?DataService の OnStartProcessingRequest() オーバーロードを調べましたが、これはあまり役に立たないようです。
解決
OData サービスを公開するために L2S に直接バインドする必要はありません。独自の Context クラスを作成し、リフレクション プロバイダーを直接使用して、クラスが公開する IQueryable プロパティからモデルを推論できます。
注記:あなたが使用している L2S アプローチも、Reflection プロバイダーを使用しているだけです。
これの鍵となるのは、L2S DataContext のクエリ可能オブジェクト (これを見てください) なので、クエリの実行に自分自身を注入できます。
- 生成された式を L2S に転送し、データベースでクエリを実行するだけです。
- 結果が L2S から返されると、Data Services に返す前に、オンザフライで復号化を実行してメモリ内で結果を列挙できます。
Reflection Provider の詳細については、こちらをご覧ください。 この郵便受け.
お役に立てれば
OData / データ サービス プログラム マネージャー