2012-08-31 9 views
8

Messengerクラスを使用する適切な方法は何ですか? ViewModels/Views通信に使用できることは知っていますが、技術/ビジネスサービス層で使用するのは良いアプローチですか?MVVM Light Messengerを適切に使用する方法

例えば、ロギング/ナビゲーションサービスでは、コンストラクタ内にいくつかのメッセージが登録され、これらのメッセージがいつアプリケーションで発生するかが分かります。送信者(ViewModel ou Service)はサービスインタフェースを参照せず、メッセージを送信するためのメッセンジャーのみを参照します。ここにはサンプルサービスがあります:

using System; 
using System.Windows; 
using System.Windows.Navigation; 
using Microsoft.Phone.Controls; 
using App.Service.Interfaces; 
using GalaSoft.MvvmLight.Messaging; 

namespace App.Service 
{ 
    public class NavigationService : INavigationService 
    { 
     private PhoneApplicationFrame _mainFrame; 

     public event NavigatingCancelEventHandler Navigating; 

     public NavigationService() 
     { 
      Messenger.Default.Register<NotificationMessage<Uri>>(this, m => { this.NavigateTo(m.Content); }); 
     } 

     public void NavigateTo(Uri pageUri) 
     { 
      if (EnsureMainFrame()) 
      { 
       _mainFrame.Navigate(pageUri); 
      } 
     } 

     public void GoBack() 
     { 
      if (EnsureMainFrame() 
       && _mainFrame.CanGoBack) 
      { 
       _mainFrame.GoBack(); 
      } 
     } 

     private bool EnsureMainFrame() 
     { 
      if (_mainFrame != null) 
      { 
       return true; 
      } 

      _mainFrame = Application.Current.RootVisual as PhoneApplicationFrame; 

      if (_mainFrame != null) 
      { 
       // Could be null if the app runs inside a design tool 
       _mainFrame.Navigating += (s, e) => 
       { 
        if (Navigating != null) 
        { 
         Navigating(s, e); 
        } 
       }; 

       return true; 
      } 

      return false; 
     } 
    } 
} 
+0

さらに読む:[グローバルな出来事は有害だと思う](http://dkturner.blogspot.hu/2010/06/global-events-considered-harmful.html) – nemesv

+0

ありがとうございました。 MVVM Messengerに固有のものではありません – Cybermaxs

答えて

23

私にとって、メッセンジャーの主な用途は、viewModels間の通信が可能なためです。検索機能にビジネスロジックを提供するために使用されるビューモデルと、出力を表示するために検索を処理するページ/ウィンドウの3つのビューモデルを提供するために使用されると、メッセンジャーは、ゆるやかにこれを行う理想的な方法です方法。

検索データを取得するviewmodelは、メッセージを消費するために現在登録されているものが消費する「検索」メッセージを送信するだけです。

ここに利点は次のとおりです。私は、消費者に影響を与えることなく、プロデューサーを交換することができます

  • お互いを知ってそれぞれ有するのviewmodelなしのviewmodels間

    1. 簡単にコミュニケーション。
    2. 少しでもメッセージコンシューマを追加できます。
    3. それは簡単なのviewmodelsを保持

    編集: だから、どのようなサービスは?

    ViewModelsはすべてUIにデータを表示する方法に関するものです。彼らはあなたのデータを受け取り、それをあなたのビューに提示できるものに形作ります。 ViewModelはサービスからデータを取得します。

    サービスは、データおよび/またはビジネスロジックをViewModelに提供します。サービス業務は、ビジネスモデル要求を処理することです。サービスが通信のために他のサービスを使用する必要がある場合、依存関係注入を使用してサービスに注入する必要があります。サービスは、通常、メッセンジャーを使用して互いに通信しません。メッセンジャーは、ビューモデルレベルでの水平方向のコミュニケーションに関するものです。

    私が見たことの1つは、mediatorとしてメッセンジャーを使用することです。代わりに、メッセンジャーを直接viewmodelに注入する代わりに、メッセンジャーをviewmodelに注入します。 viewmodelはイベントをサブスクライブし、イベントからモデルを含むイベントを受け取ります。これは、安定したアップデートフローを受信して​​いる場合、または単一のストリームにマージする複数のサービスからのアップデートを受信して​​いる場合に最適です。

    リクエスト/レスポンスタイプのリクエストをしているときに、サービスを注入する代わりにメッセンジャーを使用することは、これを行うためのコードを書く必要がありますので、意味をなさないでしょう。サービスを直接実行すると、コードが読みにくくなります。

    上記のコードを見てください。各メソッドのイベント(Navigate、CanNavigate、GoBack、GoForwardなど)を記述する必要がある場合を想像してください。あなたは多くのメッセージで終わるだろう。あなたのコードは、さらにフォローするのが難しいでしょう。

  • +0

    ありがとうございますが、サービスはどうですか? – Cybermaxs

    +0

    この男はあなたの答えをはぎ取ったと思いますか? http://www.codeproject.com/Tips/696340/Thinking-in-MVVMLight-Messenger –

    関連する問題