2017-07-30 39 views
1

私はMVVMの誰かにダイアログを実装する方法について尋ねられたこのスレッドを読むために私をお勧め:ビューモデルでMessageBoxはMVVMアプリケーションでは推奨されていませんか?

MVVM, DialogService and Dialog Result

を、ダイアログはこのように呼ばれている:

var dialog = new DialogViewmodel(); 
var result = _dialogservice.ShowDialog("My Dialog", dialog); 

if(result.HasValue && result.Value) 
{ 
    //accept true 
} 
else 
{ 
    //Cancel or false 
} 

しかし、これは、このようにmessageBoxを使うこととは違うのですか?

DialogResult result = MessageBox.Show("Hello"); 

if(result == DialgoResult-OK) 
{ 
    //accept true 
} 
else 
{ 
    //Cancel or false 
} 

この2番目のケースでは、カスタムダイアログの代わりにMessageBoxを使用しているため、違いはありません。

とにかく、多くの場合、MVVMアプリケーションでMessageBoxを使用することを読んだことがありますが、MVVMパターンが壊れてしまうため、悪い考えです。しかし、実際にこれが真実であれば、私は最初の解決策がMVVMパターンを壊さず、2番目の解決策がそれを打破する方法を見ていません。

+0

すべてのメッセージボックスは、ユーザーを中断するため、U/Xデザインエラーです。 –

+0

しかし、MVVMとソフトウェアアーキテクチャのコンテキストでは、依存関係とテスト容易性の観点から見てみてください。 MessagBoxを直接呼び出すVMは、テストするのがずっと難しくなります。 –

+0

ダイアログボックスで行ったのとまったく同じ方法で 'MessageBox'sを扱う' IAlertService'を作成してみませんか? – MickyD

答えて

3

MVVMパターンの基本的な考え方は、懸念の分離です。ビューモデルは、ダイアログの処理方法や表示方法を知ってはいけません。どうして?

  • あなたのビューモデルのテスト:ここではいくつかの理由がありませダイアログが望まれていない(あなたは、ダイアログのすべての時間をクリックする必要が想像)
  • GUIアプリケーションのコンソールアプリケーションを作成するには(ダイアログがコンソールに表示されなければなりませんポップアップボックス)
  • としてあなたのダイアログのデザインを変更する必要がありません(あなたがすべてのメッセージボックスの呼び出しを変更する必要が想像)
  • ...

ソリューション: ダイアログのための明確に定義されたインターフェイスを実装することによって、依存関係注入を使用する。 this answerには非常に優れた基本的な例があります。

結果:_dialogservice.ShowDialogの呼び出しが多分MessageBox.Showの唯一のラッパーであるだけでなく、テスト中のコンソールアプリケーションまたはデバッグログにコンソールの一部のダイアログである可能性があります。だから、コードはどのプレゼンテーションからも分かれている。

+0

OPは、彼のダイアログサービスごとに 'IAlertService'と同等の機能が必要です。 DIによって提供されるかどうかはここにもそこにもない – MickyD

関連する問題