2017-12-26 16 views
4

興味のある関係者に変更を通知するために、MessagingCenterと標準の.NETイベントハンドラを使用する違いは何ですか?同じことの興味のある関係者に変更を通知するために、MessagingCenterと標準の.NETイベントハンドラを使用する違いは何ですか?

二(未テスト)の実装は、証明するために、以下のとおりです。

public class FooClass { 
    public event EventHandler SomeEvent; 

    public void DoSomeWork() { 
    // ... stuff 
    if(SomeEvent != null) 
     SomeEvent(this, EventArgs.Empty); 
    } 
} 

public class BarClass { 
    FooClass _foo; 

    public BarClass() { 
    _foo = new FooClass(); 
    _foo.SomeEvent += delegate { 
     // ... did something 
    }; 
    } 
} 

の詩:

public class FooClass { 
    public const string SomeEventName = "SomeEvent"; 
    public void DoSomeWork() { 
    // ... stuff 
    MessagingCenter.Send<FooClass>(this, SomeEventName); 
    } 
} 

public class BarClass : IDisposable { 
    public BarClass() { 
    MessagingCenter.Subscribe<FooClass>(this, FooClass.SomeEventName, delegate { 
     // .. did something 
    }); 
    } 

    public void Dispose() { 
    MessagingCenter.Unsubscribe<FooClass>(this, FooClass.SomeEventName); 
    } 
} 

私はどんな違いがあるようには思えない伝えることができるものから、誰もがの賛辞またはの賛同のいずれかを示唆することができれば、それは私の理解を助けるだろう。現在、イベントハンドラを使用しています。

MessagingCenterの使用に切り替えることはありますか?それとも新しいベストプラクティスですか?

+0

例の違いはあまりありませんが、誰かがこのようにイベントアグリゲータを使用するのは疑問です。意図したとおりに使用すると、未加工のイベントよりも利点があります。ほとんどの場合、未処理のイベントでも同じことさえできません。 – Evk

+0

ベストプラクティスの提案はありますか? –

答えて

1
  • MessagingCenterは基本的にModel-View-ViewModel パターンで使用されます。
  • ViewModelsの間では、簡単なメッセージ契約を使用して誰にメッセージを送信したか知らずに、データの送受信や通知を行うことができます。
  • Ex。ある画面で新しいデータ を取得するためのサービスコールを行い、現在の画面から ブロードキャストメッセージを使用してUIを更新するように他の画面に通知する場合は、MessagingCenter が最適です。
  • ViewModels,の間で依存関係を起こさずにデカップリングします。一方、EventHandlersは依存関係を持ち、 が公開されないことがあります。イベントハンドラ をイベントから切り離して明示的にリソースを解放する必要があります。
  • MessagingCenterは、受信者がメッセージを送信した人の気にならない場合に適用する必要があります。 受信者が メッセージを送信した人を知る必要がある場合でも、送信者はそれを誰が処理するかは気にしません。
  • EventsMessagingCenterを使用するのは良いですが、あなたはMessagingCenterを使用して あまりにも多くのメッセージをあまり利用している場合、それは に難しいだろう、それを送信者に識別し、それを送信したとき、メッセージ との関係は難しいだろうこれで、 アプリをデバッグするときに苦労します。
2

これらのクラスにアクセスできる場合(つまり、メソッドを呼び出す場所から)、実際には大きな違いはありません。

あなたはそれらのクラス(つまり、ビューモデルやデカップリングクラス内部)へのアクセスを持っていない場合は、メッセージのサブスクリプション・イベント集計は便利なツール

メッセージセンターは、結合を低減し、ビューモデルと他のを可能にしています 単純なメッセージ契約の他にお互いに約 について何も知らずに通信するコンポーネント。

ソフトウェア工学における結合

、カップリングは、ソフトウェアモジュール間の相互依存 の程度です。どのくらい密接に接続されているかの尺度 ルーチンまたはモジュールは、 モジュール間の関係の強さです。

3

XamarinのMessagingCenterは、送信者と受信者が互いに知る必要がないため、ViewModel間の結合を減らすために使用されます。

送信者と受信者を認識し、.NETイベントを使用する「EventHub」/「EventAggregator」のようなものを作成しても、同様の構造を構築できます。 https://msdn.microsoft.com/en-us/library/ff921122.aspx

HereがEventAggregatorsの素敵な説明です:

MessagingCenter自体は

​​

ImageSourceはEventAggregator

の一種です。

イベントアグリゲータは、単純な間接的な要素です。 の最も単純なフォームでは、 に興味のあるすべてのソースオブジェクトに登録し、すべてのターゲットオブジェクトをイベント アグリゲータに登録させます。イベントアグリゲータは、ソースオブジェクト からのイベントに、そのイベントをターゲットオブジェクトに伝播することによって応答します。質問に答えるために

はMessagingCenterを使っへの切り替えの任意のポイントはありますか?新しい ベストプラクティスがありますか?

あなたがあなた自身のEventAggregatorを構築、MessagingCenterに切り替えるには良い選択肢であるEventAggregatorのようなものを使用してたりしていない場合。 Sarumanは、カップリングが何であるかを説明するのに役立ちました。あなたは常にクリーンなコードのカップリングを減らしたいと思っています。

関連する問題