5

レイヤー間で非同期に通信するためのベスト プラクティスを探しています。mvvm light ツールキットを使用しています

現在、自動生成されたコードでこれを見たので、モデルでバックグラウンドワーカーを使用しています。バックグラウンドワーカーではなく、非同期呼び出しを使用します。

public void GetConfig(Action<Config, Exception> callback)
{
    BackgroundWorker backgroundWorker = new BackgroundWorker();
    backgroundWorker.DoWork += (backgroundWorkerSender, backgroundWorkerArgs) =>
    {
        try
        {
            backgroundWorkerArgs.Result = AppEnvironment.Instance.Config;
        }
        catch (Exception exception)
        {
            backgroundWorkerArgs.Result = null;
        }
    };

    backgroundWorker.RunWorkerCompleted += (backgroundWorkerSender, backgroundWorkerArgs) =>
    {
        if (backgroundWorkerArgs.Result != null)
        {
            callback((Config) backgroundWorkerArgs.Result, null);
        }
        else
        {
            /* ToDo: exceptionhandling */
        }
    };

    backgroundWorker.RunWorkerAsync(); 
}

ここで、ViewModel に非同期部分を実装するAsyncDelegateCommandを見つけました。

private ICommand _refreshObjectDefinitionCommand;
public ICommand RefreshObjectDefinitionCommand
{
    get
    {
        return _refreshObjectDefinitionCommand
          ?? (_refreshObjectDefinitionCommand = new AsyncDelegateCommand(delegate
              {
                  IsBusy = true;
                  _dataService.GetObjectDefinition(
                    (xmlObjectDef, errorConfig) =>
                    {
                        if (errorConfig != null)
                        {
                            /* ToDo Lenz: exceptionhandling */
                            return;
                        }

                        ObjectDefinition = xmlObjectDef;
                    });

                  _dataService.GetObjectDefinitionTreeView(
                      (treenodes, errorConfig) =>
                      {
                          if (errorConfig != null)
                          {
                              /* ToDo Lenz: exceptionhandling */
                              return;
                          }

                          TreeNodes = treenodes;
                      });
              },
                                () => _isConnected, o => IsBusy = false, exception => IsBusy = false));
    }
}

ベストプラクティスについて少し混乱していますか?たくさんの記事を読みました。しかし、どういうわけか、彼らは常に異なる意見です。通常の維持努力の下で最高の互換性を確保するための準備はありますか?

考えるためのいくつかの食べ物

モデル:

http://csharperimage.jeremylikness.com/2009/12/simplifying-asynchronous-calls-in.html

http://www.dzone.com/articles/mvvmlight-and-async

ビューモデル

http://www.codeproject.com/Articles/123183/Asyncronus-MVVM-Stop-the-Dreaded-Dead-GUI-Problem

http://www.codeproject.com/Articles/441752/Async-MVVM-Modern-UI

4

2 に答える 2

1

ViewModel に非同期コードを配置し、Model にデータを保存することをお勧めします。MVVM を使い始めたときに最初に学んだことの 1 つは、モデルからロジックを削除し、代わりに ViewModel に保持することでした。ただし、コードを読むすべての人がそれを理解できる限り、コードをどこに置くかは問題ではありません。

于 2013-02-19T15:18:14.213 に答える
1

まあ、モデルの取得とビューモデルへの変換は非同期だと思います。誰がそれを行うかは、アーキテクチャによって異なりますが、ビュー モデル自体で実行することも、コントローラ レイヤーを使用して非同期ロード アップや初期化された VM のビューへのマッピングを行うこともできます。また、backgroundworkers は、並列操作に Task クラスを使用する必要がある過去のものです。そしてもちろん、VM からの変更に関するビューを通知するときは、ディスパッチャーを介して呼び出すことを忘れないでください。

コードサンプル:

    Task<string>.Factory.StartNew(() =>
{
     string text = GetArticleText();
     Application.Current.Dispatcher.BeginInvoke(new Action(()=>MyTextProperty = text));   
});
于 2013-02-19T09:30:36.290 に答える