2

私はWCF(および一般的には.NET)を初めて使用するため、これが一般的な知識である場合はお詫び申し上げます。

私はWCFソリューションを設計しています(現在、データベースにアクセスするためにEntity Frameworkを使用しています)。データベースから(おそらく非常に大きな)データセットを取得してクライアントに返したいのですが、パフォーマンス上の懸念から、データセット全体をネットワーク経由で一度にシリアル化したくありません。

結果のデータを表すある種のオブジェクトをクライアントに返すように操作したいと思います。また、クライアントでそのデータを処理し、前後に移動して実際のデータを取得できるようにします。必要に応じて配線します。

検索条件に一致する行を個別に見つけるために多くのクライアントコードを記述したくないので、役立つ場合は、個別に呼び出して各レコードを取得します。私はクライアントをできるだけシンプルに保つようにしています。

理想的には、次の擬似コードのようなクライアントコードを記述したいと思います。

Reference1.Service1Client MyService = new Reference1.Service1Client("Service1");

DelayedDataSet<MyRecordType> MyResultSet = MyService.GetAllCustomers();

MyResultSet.First();

while (!MyResultSet.Eof)
{
    Console.Writeline(MyResultSet.CurrentRecord().CUSTFNAME + " " + MyResultSet.CurrentRecord().CUSTLNAME);
    Console.Writeline("Press Enter to see the next customer");
    Console.Readline();
    MyResultSet.Next();
}

もちろん、DelayedDataSetは私が作成したばかりのものであり、.NETに存在するようなものを望んでいます。

MyService.GetAllCustomers()を呼び出すと、このDelayedDataSetオブジェクトが返されますが、実際には実際のレコードは含まれていません。CurrentRecord()が呼び出されるまで、実際のデータはネットワーク経由で送信されません。Next()とPrevious()は、サーバー側のカーソルを更新して、適切なレコードを指すようにします。クライアントにデータベースまたはEntityFrameworkを直接表示させたくありません。

私がコードを書いた方法はおそらくWCFでは機能せず、CurrentRecord()、Next()、First()などの関数は個別のサービスコントラクト操作である必要があると思います。サーバーに結果をキャッシュするために独自のコードをすべて記述したり、サーバー側でデータセットを永続化したり、サービスライブラリにすべての取得コードとナビゲーションコードを記述したりすることなく、これを行う方法を探しているだけだと思います。 。私はこれのほとんどが私のためにすでに行われていることを望んでいます。

これは非常に一般的に必要な機能のようです。それで、このようなものは存在しますか?

-ジョー

4

1 に答える 1

4

いいえ、それは WCF が行うように設計されたものではありません。

WCF の非常に基本的なコア アーキテクチャは、クライアントとサーバーがあり、(XML で) シリアル化されたデータだけがネットワークを介して 2 つの間を行き来するというものです。

WCF はリモートプロシージャ コールメソッドでも、ある種のリモート オブジェクトメカニズムでもありません。クライアントとサーバーの間で定義されたサービス (およびデータ) コントラクトに準拠するシリアル化されたメッセージを除いて、クライアントとサーバーの間に接続はありません。

WCF は、膨大な量のデータを処理するようには設計されていませんGetCustomerByID(42)。個々のメッセージ (など) を処理するように設計されています。WCF は他のプラットフォーム (非 .NET、Java、Ruby など)と相互運用できるようにゼロから設計されているため、重量のある .NET 固有の型を絶対に使用しないDataSetでください。適切なオブジェクトを使用してください。

また、WCF は最終的にすべてを XML にシリアル化し、ネットワーク経由で送信するため、渡されるすべてのデータは XML スキーマで表現できる必要があります (インターフェイスやジェネリックは除外されます)。

私があなたの投稿で読んでいることから、あなたが探しているのは、サービス レベルではなく、「インプロセス」データ アクセス レイヤーです。したがって、この道を歩み続けたい場合は、リポジトリと作業単位のパターンを Entity Framework と組み合わせて調査する必要があります。

より詳しい情報:

于 2012-12-30T21:52:28.870 に答える