使用 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);
  }
}

据我所知似乎没有任何区别,但如果有人可以提出任何 proscons要么,那会帮助我理解。目前,我一直在使用事件处理程序。

Is there any point in switching to using MessagingCenter? Or any new best practice?

如果您可以访问那些 classes(即从您想要调用方法的地方),那么实际上并没有太大区别。

但是,如果您无法访问那些 classes(即在视图模型中或解耦 class),那么消息订阅事件聚合是一个有用的工具

Message center reduces coupling and enables view models and other components to communicate with without having to know anything about each other besides a simple Message contract.

耦合

In software engineering, coupling is the degree of interdependence between software modules; a measure of how closely connected two routines or modules are the strength of the relationships between modules.

Xamarin 的 MessagingCenter 用于减少 ViewModel 之间的耦合,因为发送方和接收方不需要相互了解。

您仍然可以通过创建类似 "EventHub"/"EventAggregator" 的东西来构建类似的结构,它知道发送者和接收者并使用 .NET 事件。

MessagingCenter 本身是一种 EventAggregator

图片来源:https://msdn.microsoft.com/en-us/library/ff921122.aspx

Here 是对 EventAggregators 的一个很好的解释。

An Event Aggregator is a simple element of indirection. In its simplest form you have it register with all the source objects you are interested in, and have all target objects register with the Event Aggregator. The Event Aggregator responds to any event from a source object by propagating that event to the target objects.

回答问题:

Is there any point in switching to using MessagingCenter? Or any new best practice?

如果您不使用类似 EventAggregator 的东西,切换到 MessagingCenter 是一个不错的选择,自己构建一个 EventAggregator。 正如 Saruman 在解释耦合是什么方面给出了很好的提示。您总是希望减少耦合以获得干净的代码。

  • MessagingCenter基本都是用在Model-View-ViewModel 图案。
  • 这是交流和传递数据或通知的好方法 在 ViewModels 之间进行更新,而不知道是谁通过简单的消息合约将其发送给了谁。
  • 例如。在一个屏幕中,如果您进行任何服务调用以获取新数据 并且您想通知其他屏幕更新他们的 UI 通过 从您当前的屏幕广播消息,然后 MessagingCenter 是最好的方法。
  • 它解耦了它们而不在 ViewModels 之间造成任何依赖, 而 EventHandlers 产生依赖性并可能禁止某些事情 从被释放。您明确必须分离事件处理程序 从事件中更好的释放资源。
  • MessagingCenter 应在接收方不关心时应用 谁发送了消息,发件人不关心谁会收到消息。 当接收方需要知道谁发送了消息时,应该使用事件 消息,但发件人仍然不关心谁处理它。
  • 最好使用 MessagingCenter 而不是 Events 但是,如果你过多地使用 使用 MessagingCenter 的消息太多,很难 识别发送者和发送时间,消息之间的关系 很难猜到,因此在调试时很难 应用