0

いくつかのアーキテクチャのジレンマ: クライアント側として WPF を使用し、データ アクセス レイヤーとして EF Code First を使用し、それらの間を接続するために WCF を使用しています。私の問題は、DB にいくつかの変更を加えた後に UI を再更新することです。たとえば、次のようになります。

  1. ユーザーが UI に新しい「Person」を挿入 (ID=0)
  2. ユーザーは「Person」をDBに保存します(例:ID=10)

1 人のユーザーについて話す場合、それは非常に単純です。ID を返し、UI を更新することもできます (したがって、このユーザーに対する次の変更は「更新」と見なされます)。サーバー上で計算されたプロパティ? グラフ全体を返す必要がありますか? 言うまでもなく、クライアント側で再マップするのは非常に困難です。

CodeFirst の前は STE を使用できましたが、独自の問題があります。既知の CodeFirst アプローチについて知っている人はいますか?

お声がけいただければ幸いです。ありがとう!

4

1 に答える 1

0

クライアント側での最終更新の dateTime をリクエストとして wcf サービスに送信できます。Personsしかし、サーバー側では、その dateTime の後に更新/追加されたものをすべて取得し、結果として返します。このようにPersonして、サーバー側から変更/追加された のみを取得します。

したがって、エンティティに lastUpdate 列を追加しますPerson

編集1

クライアントではなくクライアントの情報をサーバーで更新する場合は、サーバーからのニュースを要求します。

のような使い方ができますWeb Programming

(1)client-side質問server-side- 「ねえ、私の最後の更新は 2013 年 10 月 2 日 20:00 でした」、サーバーは DB を調べます - 「2013 年 10 月 2 日 20:00 以降のニュースですか?」もし、そうなら:

a) ニュースをクライアントに返す

DB にニュースがない場合:

b) 彼は null を返しませんが、Thread.Sleep(somevalue) を返します。彼は寝てから、db へのクエリを繰り返し、「db にニュースがあります」と尋ねます。したがって、DB のニュースが表示されるまで、すべてが繰り返されます。db にニュースが表示List<data>された後、dateTime の後に更新された を返します。そのクライアントがデータを取得した後、ポイント (1) に戻ります。

したがって、サーバーに多くのリクエストを行うのではなく、1 つのリクエストのみを行い、サーバーからのニュースを待ちます。

2 つのことに注意してください。

1) クライアントの待機時間が長すぎると、サーバー側で例外がスローされるため (実際のエラー コードは覚えていませんが、今は重要ではありません)、この例外をキャッチしてclient-sideに新しいリクエストを作成する必要がありserver-sideます。またserver-side、クライアントからのリクエストの量を最小限に抑えるために、待ち時間ができる限り設定する必要があります。

2)data-updaterアプリケーションが実行されるメインスレッドではなく、新しいスレッドでこれを実行する必要があります。

コードからどのように見えるか (動作しない可能性があります。ロジックを示したいだけです):

サーバ側:

public List<SomeData> Updater(DateTime clientSideLastUpdate)
{
     List<SomeData> news = new List<SomeData>();
     while(true)
     {
         List<SomeData> news = dbContext.SomeData.Where(e=>e.UpdateDateTime > clientSideLastUpdate).ToList();
         if(news.Count()>0)
         {
             return news;
         }
     }
}

クライアント側:

public static void Updater()
{
    try
    {
        var news = someServiceReference.Updater(DateTime clientSideLastUpdate);
        RenewDataInForms(news);
        Updater();
    }
    catch(ServerDiesOrWhatElseExcepption)
    {
        Updater()
    }
}

コードのどこかで、このアップデーターを新しいスレッドで実行します。

 Thread updaterThread = new Thread(Updater());
 updaterThread.Start();

編集 2

1 つの要求ですべてのエンティティを更新する場合SomeDataは、更新可能にするすべてのエンティティのリストを含む Dto オブジェクトを追加する必要があります。はserver-side完了し、この Dto オブジェクトを返します。

それが役に立てば幸い。

于 2013-02-21T07:50:17.103 に答える