2011年05月09日

MVVM:Messengerを理解するために自作してみた(1)

   このエントリーをはてなブックマークに追加 Clip to Evernote
MVVMを勉強していたら、Messengerというものが出てきました。
これって何だろうか。
.NET Frameworkのクラスじゃなくて、MVVM Light Toolなどのフレームワークで
用意されているもので、ViewModelからViewを操作する時に利用するもののようです。
要は、ViewModelとViewの仲を取り持つ仲介者クラスです。

と、ここまでは分かりましたが、それ以上のこと(特にどういう仕組みなのか)が良くわかりません。
そこで、理解を深めるために、MVVM Light Toolの外部インターフェイスを参考に
Messengerクラスをちょっと自作してみました。

とはいっても、ものすごい手抜きなので、これを実際に使うわけにはいかないと思うし、
MVVM Light Toolのソースコードは一切みていないので、僕の理解が間違っている可能性は
ありますが、まあ、Messengerを理解を助けるにはなるんじゃないかと思います。

では、オレオレ Messengerとそれに関連するクラスのコードを示します。

まずは、「メッセージ」の基底クラス。名前は、VmMessageとします。
この「メッセージ」は、MessageBoxを表示するメッセージとか、画面遷移するメッセージなど、
ViewModelからViewへメッセージを送るためのクラスです。ViewModelとView間の
データ受け渡し用としても利用されます。

ViewModelからViewへの通知をする際に、このMessageクラスが使われます。

このクラスは、各Messegeクラスの基底クラスになり、Senderプロパティを持っています。

では、これから派生したDialogBoxMessageを定義してみます。
これは、「MessageBox.Showを呼び出してね」というメッセージを表しています。

本当ならば、MessageBoxOptions や MessageBoxImageなどもプロパティとして用意すべきですが、
今回は省略します。
このクラスは、ViewModelから呼び出されます。たとえば、こんなコードになります。


Messengerクラスを経由して、DialogBoxMessageメッセージをViewに送ることで、
View側で、MessageBoxを表示できるようにしているわけです。

どうして、こんな面倒なことをやるかと言えば、ダイアログを表示するという処理は、Viewの役割であり、
ViewModelから直接呼び出すことは、その役割分担を崩すことになってしまうからです。

そもそも、「ViewModelは、Viewを知らない」が大前提なので、直接Viewのメソッドを呼び出すわけには
いかないという事情があります。

こうすることで、ViewModelとViewの結合度を低くすることができます。
結合度が低ければ、片方の修正が、もう片方に影響を与える度合いが低くなります。

次に、Messengerクラスの実装ですが、続きは、また今度。


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52146779
この記事へのトラックバック
素敵なエントリーの登録ありがとうございます - .NET Clipsからのトラックバック
MVVM:Messengerを理解するために自作してみた(1):Gushwell's C# Dev Notes【.NET Clips】at 2011年05月28日 10:33