繁体   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