Codon 入门 - 第 3 部分






4.56/5 (4投票s)
使用 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。
虽然没有实际意义,但它演示了如何发送和接收消息。通常,您不会订阅仅从同一类分发的消息。
图 1. 对话框确认消息已收到。
专业提示:Codon 中的一些类,如 Messenger
和 ActionCommand
类,实现了全局异常处理系统。默认情况下,如果这些类中的任何一个引发了异常,默认异常处理类 LoggingExceptionHandler
就会记录异常并请求重新抛出该异常。这消除了将所有代码块包装在 try/catch 块中的需要。
注意:虽然 UWP 和 WPF 都有捕获未处理异常的方法,但 Android 并非如此。如果您的 Android 应用程序中发生未处理异常,操作系统将终止它。建议您实现自己的 IExceptionHandler 并像这样将其注册到 IoC 容器中
Dependency.Register<IExceptionHandler>(() => new MyExceptionHandler(), true);
结论
在本文中,您学习了如何使用 Messenger
类实现组件之间的通信。在下一部分中,您将学习如何使用导航服务在页面之间进行导航。
我希望这个项目对您有用。如果觉得有用,请评分和/或在下方留言。
历史
2017年4月2日
- 首次发布