使用 MessagingCenter 和标准 .NET 事件处理程序将更改通知相关方有什么区别?

Pra*_*eep 5 .net c# events xamarin.forms messagingcenter

使用 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
   };
  }
}
Run Code Online (Sandbox Code Playgroud)

诗句:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,似乎没有任何区别,但是如果有人可以提出任何优点缺点,那将有助于我理解。目前,我一直在使用事件处理程序。

改用 MessagingCenter 有什么意义吗?或者任何新的最佳实践?

Tob*_*eel 6

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

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

MessagingCenter 本身是一种EventAggregator

EventAggregator 的图片

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

是 EventAggregators 的一个很好的解释。

事件聚合器是一个简单的间接元素。以最简单的形式,您将它注册到您感兴趣的所有源对象,并将所有目标对象注册到事件聚合器。事件聚合器通过将事件传播到目标对象来响应来自源对象的任何事件。

回答问题:

改用 MessagingCenter 有什么意义吗?或者任何新的最佳实践?

如果您不使用 EventAggregator 之类的东西,那么切换到 MessagingCenter自己构建 EventAggregator是一个不错的选择。正如萨鲁曼在解释耦合是什么方面做了一个很好的暗示。您总是希望为干净的代码减少耦合。


Mil*_*anG 4

  • MessagingCenter 基本上使用模型-视图-视图模型模式。
  • ViewModels这是一种在不知道谁通过简单的消息合约将其发送给谁的情况下进行通信和传递数据或通知更新的好方法。
  • 前任。在一个屏幕中,如果您进行任何服务调用来获取新数据,并且您希望通过当前屏幕上的广播消息来通知其他屏幕更新其 UI,那么这MessagingCenter 是最好的方法。
  • 它将它们解耦,而不使它们之间产生任何依赖关系ViewModels,同时EventHandlers产生依赖关系并可能禁止某些内容被释放。您明确必须将事件处理程序与事件解耦,以更好地释放资源。
  • MessagingCenter当接收者不关心谁发送了消息并且发送者也不关心谁将接收该消息时,应该应用。当接收者需要知道谁发送了消息,但发送者仍然不关心谁处理该消息时,应该使用事件。
  • MessagingCenter用over固然好Events,但如果使用过多的消息MessagingCenter,就很难识别是谁发送的、何时发送的,消息之间的关系也很难猜测,这样就很难同时使用了。调试应用程序。