0

MS SQL データベースに 1 つのテーブルがあります。(2008 R2) テーブル名: MESSAGES フィールド: message_id、message、is_synced

私のモバイルスマートフォンでは、アプリケーションが各レコードを同期したときにテーブルレコードを同期し、テーブルを更新するアプリケーションを開発する必要があります。WCF への最小数の呼び出しをサポートする必要があるため、レコードごとに呼び出しを生成してはなりません。

テーブルに n 個のレコードがある場合、WCF を n 回呼び出す必要はありません。1 回呼び出して、すべてのレコードを取得し、WCF を使用してすべての同期結果を同期して返します。それは正しい方法ですか?より良い実装を提案できますか?

4

1 に答える 1

1

状況が変化したときに、サービス外のすべてのスマートフォンにデータを送信するために、Duplex 通信を行うことができます。

http://www.codeproject.com/Articles/491844/A-Beginners-Guide-to-Duplex-WCF

http://msdn.microsoft.com/en-us/library/ms731064.aspx

ただし、現在の実装を考慮して現在の質問に答えるには、サービスをポーリングして、開始時またはタイマーですべてのメッセージのリストを取得できます

サーバーでは、単純なコレクションに次のようなものを含めることができます。

[ServiceContract(Namespace = "Contracts.IDatabaseResponder")]
public interface IDatabaseResponder
{
    //You could use an object rather than a string but then you have to mark the object
    [OperationContract]
    List<String> GetMessages();
    [OperationContract]
    void SyncMessagesBack(List<String> messages);

}



[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class DatabaseResponder : IDatabaseResponder
{
    List<String> _DatabaseMessageList;

    public List<String> GetMessages()
    {
        //Code here to go to SQL and grab all of the needed Messages
        //..


        return _DatabaseMessageList;
    }

    public void SyncMessagesBack(List<String> messages)
    {
        //Code here to go to SQL and update messages you want to update
        //..


    }

}

次に、クライアント側では、次のようなものが機能します。

    //Can use plain old list or ObservableCollection
    private IList<String> _DatabaseMessagesItems = new ObservableCollection<String>();
    private DatabaseResponderClient _Proxy;
    DispatcherTimer dispatcherTimer;
    List<String> LocalListOfMessages;

    public Constructor()
    {

          _Proxy = new DatabaseResponderClient();
          _Proxy.InnerChannel.Faulted += new EventHandler(InnerChannel_Faulted);


       try
       {
                _DatabaseMessagesItems = _Proxy.GetMessages();
       }
       catch (Exception ex)
       {
                MessageBox.Show(ex.Message);

                throw;
       }

       dispatcherTimer = new DispatcherTimer();
       dispatcherTimer.Tick += new EventHandler(dispatcherTimerTick);
       dispatcherTimer.Interval = new TimeSpan(0, 0, 60);
       dispatcherTimer.Start();

       dispatcherTimerTick();
    }


    private void dispatcherTimerTick(object sender, EventArgs e)
    {

        try
        {
             //Push back to the service any new or changed list of messages you need to push
             _Proxy.SyncMessagesBack(LocalListOfMessages);
        }
        catch (Exception ex)
        {
            //Handel error
        }
    }

   //Code to keep track of new messages add them etc
   //...
于 2013-08-23T20:36:34.103 に答える