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

标签 c# .net 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
   };
  }
}

诗句:

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

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

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

最佳答案

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

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

MessagingCenter 本身是一种 EventAggregator

Image of 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很好地暗示了耦合是什么。您总是希望减少耦合以获得干净的代码。

关于c# - 使用 MessagingCenter 和标准 .NET 事件处理程序来通知相关方更改有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47977912/

相关文章:

c# - SqlCeConnection 处理中的访问冲突异常

c# - Ejabberd 模仿

c# - 使用 P/Invoke 编码双参数

c# - 从 64 位 exe 访问 32 位 DLL 的方法

c# - System.Windows.Data 错误 : 1 System. Windows.Data 错误:5

c# - 从 .Net 连接到 AS400

.net - 使用 .NET SDK 12 从 Azure Blob 存储中的特定目录/文件夹获取文件

c# - 限制事件队列的最佳实践

javascript - 在通过导入/导出完成代码之前,我将如何防止事件发生?

android - 如何到达 ListView 的底部,加载更多项目