簡體   English   中英

使用MessagingCenter和標准.NET事件處理程序為感興趣的各方通知更改有什么區別?

[英]What is the difference between using MessagingCenter and standard .NET event handlers for informing interested parties of changes?

使用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有什么意義嗎? 還是任何新的最佳做法?

Xamarin的MessagingCenter用於減少ViewModel之間的耦合,因為發送方和接收方不需要彼此了解。

您仍然可以通過創建類似“EventHub”/“EventAggregator”的東西來構建類似的結構,它知道發送者和接收者並使用.NET事件。

MessagingCenter本身就是一種EventAggregator

EventAggregator的圖片

ImageSource: https//msdn.microsoft.com/en-us/library/ff921122.aspx

以下是EventAggregators的一個很好的解釋。

Event Aggregator是一個簡單的間接元素。 在最簡單的形式中,您可以注冊所有您感興趣的源對象,並使所有目標對象都注冊到Event Aggregator。 Event Aggregator通過將該事件傳播到目標對象來響應源對象中的任何事件。

回答這個問題:

切換到使用MessagingCenter有什么意義嗎? 還是任何新的最佳做法?

如果您沒有使用類似EventAggregator的東西,那么切換到MessagingCenter 自行構建EventAggregator是一個不錯的選擇。 薩魯曼在解釋什么是耦合方面做了很好的暗示。 你總是希望減少耦合以獲得干凈的代碼。

如果您可以訪問這些類(即從您想要調用方法的位置),那么確實沒有太大區別。

但是,如果您無權訪問這些類(即在視圖模型或解耦類中),那么消息訂閱事件聚合是一個有用的工具

消息中心減少了耦合,使視圖模型和其他組件能夠進行通信,除了簡單的消息合同之外,無需了解彼此的任何信息。

耦合

在軟件工程中,耦合是軟件模塊之間相互依賴的程度; 衡量兩個例程或模塊之間緊密聯系的程度是模塊之間關系的強弱程度。

  • MessagingCenter基本上用於Model-View-ViewModel模式。
  • 這是一種很好的方式來通信和傳遞數據或在ViewModels之間通知更新,而無需知道是誰通過簡單的消息合同將其發送給誰。
  • 防爆。 在一個屏幕中,如果您進行任何服務調用以獲取新數據,並且您希望通過當前屏幕上的廣播消息通知其他屏幕更新其UI,則MessagingCenter是最佳方法。
  • 它解耦它們而不會在ViewModels之間產生任何依賴關系,而EventHandlers會產生依賴關系並可能禁止發布某些內容。 您必須明確地將事件處理程序與事件分離,以便更好地釋放資源。
  • 當接收者不關心誰發送消息而發送者不關心誰將接收消息時,應該應用MessagingCenter 當接收者需要知道誰發送了消息時,應該使用事件,但發送者仍然不關心誰處理它。
  • 最好使用MessagingCenter不是Events但如果你使用MessagingCenter過多地使用過多的MessagingCenter ,就很難確定是誰發送了它,當發送它時,消息之間的關系很難被猜測,從而使它成為可能。調試應用程序時遇到困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM