65.9K
CodeProject 正在变化。 阅读更多。
Home

Codon 入门 - 第 3 部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (4投票s)

2017 年 4 月 4 日

CPOL

3分钟阅读

viewsIcon

10094

使用 Codon 的 Messenger 在应用程序组件之间传递消息。

Codon是一个零依赖的跨平台MVVM框架,用于创建基于UWP、WPF和Xamarin的应用程序。它提供了您快速创建复杂且可维护的应用程序所需的大部分功能。

引言

上一篇文章中,我们学习了如何使用 Codon 的设置服务来存储和检索设置。在本文中,您将学习如何实现应用程序中组件之间的通信。

本文中提供的代码位于Samples 存储库中的 Sample001 中

组件之间的通信是任何稍微复杂的应用程序中必不可少的一部分。通过使用弱引用发布/订阅消息系统,您可以解耦组件并减少因事件订阅而导致的内存泄漏的可能性。Codon 的发布/订阅消息服务是 IMessenger 接口的实现。它允许您应用程序中的组件订阅特定类型的消息对象,并允许其他组件分发这些消息。Codon 内部广泛使用它来执行诸如通知订阅者设置已更改之类的操作。

理解 Messenger

Codon 的 IMessenger 实现使用基于接口的订阅模型。您可以通过实现 IMessageSubscriber<T> 接口来指定希望类接收的消息。 T 的 CLR Type 决定了消息的签名或标识。

这种声明式的消息订阅方法提高了透明度,因为消息订阅在类型级别可见。

为了在消息发布时接收它们,订阅者需要调用 messenger 的 Subscribe 方法。

注意:如果您从ViewModelBase派生,messenger 的 Subscribe 方法会在基类构造函数中为您调用。

示例的 Page1ViewModel 类通过实现 IMessageSubscriber<examplemessage> 接口来声明对 ExampleMessage 消息的订阅。请参阅清单 1。

消息对象可以是 POCO。`ExampleMessage` 类不派生自 Codon 基类。

在后台,当 ViewModelBase 类调用 messenger 的 Subscribe 方法时,messenger 会创建一个对 view-model 的弱引用,并在发布 ExampleMessage 对象时调用 ReceiveMessageAsync(ExampleMessage message) 方法。

注意:您可以调用 messenger 的 Unsubscribe 方法来取消订阅 IMessenger

清单 1. Page1ViewModel 实现 IMessageSubscriber<examplemessage> 接口。

public class Page1ViewModel : ViewModelBase, 
		IMessageSubscriber<examplemessage>
    {
...
	public Task ReceiveMessageAsync(ExampleMessage message)
	{
		dialogService.ShowMessageAsync(
			"Received the message.", "Message from App");

		return Task.FromResult<object>(null);
	}
...
}

如果一个对象使用 ExampleMessage 对象作为参数调用 messenger 的 PublishAsync 方法,页面就会收到消息。

从 ViewModel 分发消息

Page1ViewModel 类包含一个 PublishMessageCommand,它绑定到视图中的一个按钮。

ActionCommand publishMessageCommand;

public ICommand PublishMessageCommand => publishMessageCommand 
          ?? (publishMessageCommand = new ActionCommand(PublishMessage));

当按钮被点击时,将调用 PublishMessage 方法。请参阅清单 2。

ViewModelBase 类包含一个 Messenger,这意味着我们无需使用依赖注入来检索它。

注意: PublishAsync 是一个可等待方法,这很有用,例如,如果您的消息对象包含一个允许取消操作的属性。Codon 包含一些预置消息可用于此目的。例如 CancellableMessageBase 类。

清单 2: Page1ViewModel PublishMessage 方法。

void PublishMessage(object arg)
{
	Messenger.PublishAsync(new ExampleMessage(), true);
}

点击Page 1上的Publish Message按钮会分发消息,并在同一个 ViewModel 中收到。请参阅图 1。

虽然没有实际意义,但它演示了如何发送和接收消息。通常,您不会订阅仅从同一类分发的消息。

 

Dialog confirming message received

图 1. 对话框确认消息已收到。

 

专业提示:Codon 中的一些类,如 MessengerActionCommand 类,实现了全局异常处理系统。默认情况下,如果这些类中的任何一个引发了异常,默认异常处理类 LoggingExceptionHandler 就会记录异常并请求重新抛出该异常。这消除了将所有代码块包装在 try/catch 块中的需要。

注意:虽然 UWP 和 WPF 都有捕获未处理异常的方法,但 Android 并非如此。如果您的 Android 应用程序中发生未处理异常,操作系统将终止它。建议您实现自己的 IExceptionHandler 并像这样将其注册到 IoC 容器中

Dependency.Register<IExceptionHandler>(() => new MyExceptionHandler(), true);

结论

在本文中,您学习了如何使用 Messenger 类实现组件之间的通信。在下一部分中,您将学习如何使用导航服务在页面之间进行导航。

我希望这个项目对您有用。如果觉得有用,请评分和/或在下方留言。

历史

2017年4月2日

  • 首次发布
© . All rights reserved.