使用MessagingCenter和标准.NET事件处理程序为感兴趣的各方通知更改有什么区别?

问题描述 投票:4回答:3

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

c# .net events xamarin.forms messagingcenter
3个回答
2
投票
  • MessagingCenter基本上用于Model-View-ViewModel模式。
  • 这是一种很好的方式来沟通和传递数据或通知ViewModels之间的更新,而不知道是谁通过简单的消息合同将其发送给谁。
  • 防爆。在一个屏幕中,如果您进行任何服务调用以获取新数据,并且您希望通过当前屏幕上的广播消息通知其他屏幕更新其UI,那么MessagingCenter是最佳方法。
  • 它在ViewModels之间没有任何依赖性而将它们分离,而EventHandlers依赖并且可能禁止某些东西被释放。您必须明确地将事件处理程序与事件分离,以便更好地释放资源。
  • 当接收者不关心谁发送消息而且发送者不关心谁将接收消息时,应该应用MessagingCenter。当接收者需要知道谁发送了消息时,应该使用事件,但发送者仍然不关心谁处理它。
  • 使用MessagingCenter而不是Events是好的,但是,如果你使用MessagingCenter过多地使用太多的消息,很难确定谁发送它,当发送它时,消息之间的关系很难猜测,从而使它成为可能调试应用程序时遇到困难。

3
投票

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

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

MessagingCenter本身就是一种EventAggregator

Image of EventAggregator

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

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

Event Aggregator是一个简单的间接元素。在最简单的形式中,您可以注册所有您感兴趣的源对象,并使所有目标对象都注册到Event Aggregator。 Event Aggregator通过将该事件传播到目标对象来响应源对象中的任何事件。

回答这个问题:

切换到使用MessagingCenter有什么意义吗?还是任何新的最佳做法?

如果您没有使用类似EventAggregator的东西,那么切换到MessagingCenter或自行构建EventAggregator是一个不错的选择。由于Saruman在解释什么是耦合方面做了很好的暗示。你总是希望减少耦合以获得干净的代码。


3
投票

如果您可以访问这些类(即从您想要调用方法的位置),那么确实没有太大的区别。

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

消息中心减少了耦合,使视图模型和其他组件能够进行通信,除了简单的消息合同之外,无需了解彼此的任何信息。

耦合

在软件工程中,耦合是软件模块之间相互依赖的程度;衡量两个例程或模块之间紧密联系的程度是模块之间关系的强弱程度。

© www.soinside.com 2019 - 2024. All rights reserved.