5

使用 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 有什么意义吗?或者任何新的最佳实践?

4

3 回答 3

6

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

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

MessagingCenter 本身就是一个EventAggregator

EventAggregator 的图片

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

是 EventAggregators 的一个很好的解释。

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

要回答这个问题:

切换到使用 MessagingCenter 有什么意义吗?或者任何新的最佳实践?

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

于 2017-12-26T11:42:52.303 回答
4

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

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

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

耦合

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

于 2017-12-26T11:40:49.517 回答
4
  • MessagingCenter 基本上用于 Model-View-ViewModel 模式。
  • ViewModels这是一种在不知道谁通过简单的消息合约将数据发送给谁的情况下进行通信和传递数据或通知更新的好方法。
  • 前任。在一个屏幕中,如果您进行任何服务调用以获取新数据,并且您想通知其他屏幕通过从当前屏幕广播消息来更新其 UI,那么MessagingCenter 这是最好的方法。
  • 它将它们解耦而不在 之间建立任何依赖关系ViewModels,同时EventHandlers建立依赖关系并且可能会禁止某些内容被释放。您必须明确地将事件处理程序与事件分离,以更好地释放资源。
  • MessagingCenter当接收者不关心谁发送了消息并且发送者不关心谁会收到它时,应该应用。当接收者需要知道谁发送了消息,但发送者仍然不在乎谁处理它时,应该使用事件。
  • MessagingCenterover也不错,Events但是如果使用太多Messages using MessagingCenter,就很难识别是谁发的,什么时候发的,消息之间的关系就很难猜到,所以很难同时调试应用程序。
于 2017-12-26T13:48:38.427 回答