2009-05-19 5 views
6

私はネットワーク接続でリッスンするアプリケーションを作成しています。データが到着したときに返信し、受信データによっては返信前にユーザーに問い合わせる必要があります(ダイアログを表示)。Model-View-Viewmodelアーキテクチャでモデルのメソッドの途中からユーザー入力をきれいに取得するにはどうすればいいですか?

MV-VMアーキテクチャーでこれを正しく行う方法がわかりません:受信データに基づいてGUIを更新する必要がある場合は、イベントと観測可能なコレクションへのバインドがうまくいきます。返信する前にユーザーですか?

また、私の返信アルゴリズムを1か所にし、複数のコールバックに分かれていて、不明瞭な 'who-calls-who'の責任を持たせたいので、それを同期してやりたい。

単に、

HandleMessage(Message msg){ 
    string reply; 
    if (msg.type == 1) { 
     reply = ... 
    } else { 
     string question = msg... 
     reply = ShowModalDialog(question); // MVVM violation! 
    } 
    sender.Send(reply); 
} 

のようなものが、モデルは再利用可能とテスト可能にする必要があるように私は、モデルからビューまたはのviewmodelを呼び出すにしたくない - 私はすべてのテスト実行中にダイアログをポップしたくありません、それはMVVMの違反になります!非同期であるため、イベントはありません(私が知る限り単方向であり、イベント起点への応答を得るための後方チャネルがありません)。

これは実行可能ですか?これは私がいくつかのテスト駆動開発者伝播者に尋ねた質問です。これまでのところ、私は実用的な答えを得られませんでした。しかし、処理の途中で追加入力が必要なことはかなり一般的です。

ありがとうございます!

EDIT:これはアプリケーションロジックなのでモデルにはっきりと属していますが、この場合でも実際にはビジネスの途中でユーザーの入力が必要な場合の解決方法を知りたいモデル内の論理ルーチン。

答えて

3

これは、MVVMは、それ自身で解決していないこれらの問題の一つです。 1つの解決策は、サービスを使用してユーザーにクエリを行い、ViewModelにそのサービスを使用させることです。私のプロジェクトで

我々はサービスフレームワークを提供する以外にも、簡単にGUIの開発を行うための他のツールを提供しPRISMを使用しています。

Here'sサービスはPRISMにどのように動作するかの過去記事。

具体的には、私はある種のIOCを作成し、それと照会サービスを登録し、次にIOCのViewModelパスでIOCを使用して照会サービスを取得し、それを使用してユーザーを照会します。もっと仕事?確かに。ただし、IOCで単に照会サービスを置き換えるだけで、照会サービスを別の実装と置き換えることができます。

MVVM +サービス=究極のパワー!

+0

+1それは私がしたよりもはるかに優れて説明します。 –

+0

ありがとう、これはクリーンなソリューションのように聞こえる、私はリンクを読んでみましょう(それらのおかげで!) –

0

実際、すべてがアプリケーションロジックに属しているわけではありません。

2つの異なる「ビュー」があるようです。最初のもの(ネット上に入ってくるデータ)と2番目のもの(確認ダイアログ)があります。

モデルは、新しいビューを表示する必要があることを決定して表示するビューを通知し、後でそのビューからの入力に応答する必要があります。

すべてを1ステップで実行しないでください。

+0

私は最初の発言に同意します - はい、最初のビューは単にサービスのコンソールログウィンドウであり、データ入力ダイアログは別のビューと考えることができます。 Hovewer、モデルはアルゴリズム駆動型です。UIで非同期に呼び出される部分に1つのアルゴリズムを分割する必要があり、実際には不可能な場合があります。 また、メンテナンス性の観点からは、1つのメトロッド内にアルゴリズムを持つ方がはるかに優れています。したがって、GUIの呼び出しは同期している必要があります。 –

+0

私はあなたの言いたいことを正確に理解しています。私はいくつかの本当に刺激的な場所でステートマシンを使用しなければなりませんでした。私はあなたがそこに行きたくないことを知っていますが、あなたがしなければならない良いチャンスがあります。そうでない場合は、素晴らしいですが、それを上手く検討したいかもしれません - それはおそらくあなたがやってしまうことでしょう。ダイアログボックスは、しばしばスレッドを解放することを意味する。私はそれが狂っているあなたのポイントに同意しないでしょう:) –

1

このアイデアは、MVVMの教義に厳格に維持している場合、私は知らないが、私は(インターフェースを介して参照される)サービスとして、ダイアログの機能をカプセル化します。このサービスの実装はUIレイヤーになりますが、テスト目的のためにはインターフェイスを "模擬"するだけです。