使用Xamarin.Forms的企业应用程序模式(电子书)--松散耦合部件之间的通信

简介: 发布订阅模式是一种消息传递模式,其中发布者发送消息而不知道任何接收者(称为订阅者)。 类似地,订阅者听取特定的消息,而不了解任何发布者。 .NET中的事件实现了发布 - 订阅模式,并且是不需要松散耦合的组件之间的通信层的最简单和直接的方法,例如控件和包含它的页面。

发布订阅模式是一种消息传递模式,其中发布者发送消息而不知道任何接收者(称为订阅者)。 类似地,订阅者听取特定的消息,而不了解任何发布者。

.NET中的事件实现了发布 - 订阅模式,并且是不需要松散耦合的组件之间的通信层的最简单和直接的方法,例如控件和包含它的页面。 然而,发布者和订阅者的生命周期通过对象引用彼此耦合,订户类型必须具有对发布者类型的引用。 这可以创建内存管理问题,特别是当存在订阅静态或长寿命对象的事件的短暂的对象时。 如果事件处理程序没有被删除,则订阅者将通过在发布者中引用它来保持活动状态,这将防止或延迟用户的垃圾回收。

消息中心简介

Xamarin.Forms MessagingCenter类实现了发布 - 订阅模式,允许不便于通过对象和类型引用链接的组件之间的基于消息的通信。 这种机制允许发布者和订阅者在不相互引用的情况下通信,有助于减少组件之间的依赖关系,同时还允许组件进行独立开发和测试。

MessagingCenter类提供组播发布 - 订阅功能。 这意味着可以有多个发布者发布单个消息,并且可以有多个订阅者监听相同的消息。 图4-1说明了这种关系:

 

4-1:组播发布 - 订阅功能

发布者使用MessagingCenter.Send方法发送消息,而订阅者使用MessagingCenter.Subscribe方法监听消息。 此外,订阅者还可以使用MessagingCenter.Unsubscribe方法取消订阅邮件订阅(如果需要)。

在内部,MessagingCenter类使用弱引用。 这意味着它不会保持对象活着,并且允许它们被垃圾收集。 因此,当班级不再希望收到消息时,只需要取消订阅消息。

eShopOnContainers移动应用程序使用MessagingCenter类在松散耦合的组件之间进行通信。 应用程序定义了三条消息:

· 当将Item添加到购物篮时,AddProduct消息由CatalogViewModel类发布。 作为回报,BasketViewModel类订阅消息,并增加购物篮中的项目数量作为响应。 此外,BasketViewModel类也取消订阅此消息。

· 当用户向目录中显示的项目应用品牌或类型过滤器时,由CatalogViewModel类发布过滤器消息。 作为回报,CatalogView类订阅消息并更新UI,以便仅显示与过滤条件匹配的项目。

· 当成功创建和提交新订单后,当CheckoutViewModel导航到MainViewModel时,ChangeTab消息由MainViewModel类发布。 作为回报,MainView类订阅消息并更新UI,以便我的配置文件选项卡处于活动状态,以显示用户的订单。

注意:虽然MessagingCenter类允许在松散耦合的类之间进行通信,但它不提供此问题的唯一架构解决方案。 例如,视图模型和视图之间的通信也可以通过绑定引擎和通过属性更改通知来实现。 另外,两个视图模型之间的通信也可以通过在导航期间传递数据来实现。

eShopOnContainers移动应用程序中,MessagingCenter用于在UI中更新以响应另一个类中发生的操作。 因此,消息在UI线程上发布,订阅者在同一个线程上接收消息。

? 提示:执行UI更新时,向UI线程的元组。 如果需要从后台线程发送的消息来更新UI,则可以通过调用Device.BeginInvokeOnMainThread方法在订阅者的UI线程上处理消息。

有关MessagingCenter的更多信息,请参阅Xamarin开发人员中心的MessagingCenter

定义消息

MessagingCenter消息是用于标识消息的字符串。 以下代码示例显示了eShopOnContainers移动应用程序中定义的消息:


点击(此处)折叠或打开

  1. public class MessengerKeys
  2. {
  3.     // Add product to basket
  4.     public const string AddProduct = "AddProduct";
  5.  
  6.     // Filter
  7.     public const string Filter = "Filter";
  8.  
  9.     // Change selected Tab programmatically
  10.     public const string ChangeTab = "ChangeTab";
  11. }

在这个例子中,使用常量来定义消息。 这种方法的优点是它提供了编译时类型的安全和重构支持。

发表消息

发布商通过MessagingCenter.Send重载之一通知订阅者消息。 以下代码示例演示如何发布AddProduct消息:

MessagingCenter.Send(this, MessengerKeys.AddProduct, catalogItem);

在这个例子中,Send方法指定三个参数:

· 第一个参数指定发件人类。 发件人类必须由希望接收邮件的任何用户指定。

· 第二个参数指定消息。

· 第三个参数指定要发送给用户的有效载荷数据。 在这种情况下,有效载荷数据是CatalogItem实例。

发送方法将使用火灾忘记的方式发布消息及其有效载荷数据。 因此,即使没有订阅者注册接收消息,也会发送该消息。 在这种情况下,发送的消息将被忽略。

注意:MessagingCenter.Send方法可以使用通用参数来控制邮件的传递方式。 因此,不同的订户可以接收到共享消息身份但发送不同有效载荷数据类型的多个消息。

订阅消息

订阅者可以注册以使用MessagingCenter之一接收消息。订阅超载。 以下代码示例演示了eShopOnContainers移动应用程序如何订阅并处理AddProduct消息:


点击(此处)折叠或打开

  1. MessagingCenter.Subscribe(
  2.     this, MessageKeys.AddProduct, async (sender, arg) =>
  3. {
  4.     BadgeCount++;
  5.  
  6.     await AddCatalogItemAsync(arg);
  7. });

在此示例中,Subscribe方法订阅AddProduct消息,并响应于接收到消息执行回调委托。 此回调委托,指定为lambda表达式,执行更新UI的代码。

? 提示:考虑使用不变的有效载荷数据。 不要尝试从回调委托中修改有效负载数据,因为多个线程可能会同时访问接收到的数据。 在这种情况下,有效载荷数据应该是不可变的,以避免并发错误。

用户可能不需要处理已发布消息的每个实例,并且可以通过在Subscribe方法中指定的通用类型参数来控制。 在此示例中,订阅者将只接收从CatalogViewModel类发送的AddProduct消息,该类的负载数据是CatalogItem实例。

取消订阅消息

订阅者可以取消订阅他们不想再收到的消息。 这是通过MessagingCenter之一实现的。请注意重载,如以下代码示例所示:


点击(此处)折叠或打开

  1. MessagingCenter.Unsubscribe(this, MessengerKeys.AddProduct);



在此示例中,Unsubscribe方法语法反映了订阅接收AddProduct消息时指定的类型参数。

概要

Xamarin.Forms MessagingCenter类实现了发布 - 订阅模式,允许不便于通过对象和类型引用链接的组件之间的基于消息的通信。 这种机制允许发布者和订阅者在不相互引用的情况下通信,有助于减少组件之间的依赖关系,同时还允许组件进行独立开发和测试。

目录
相关文章
|
前端开发 .NET 测试技术
使用Xamarin.Forms开发企业应用程序
与企业应用开发人员多年合作,我们知道他们面临着几个挑战,其中包括: 随着时间的推移,需求不断变化 新的商机和挑战 在开发期间持续的反馈可能会显着影响应用程序的范围和要求 考虑到这一点,重要的是构建既灵活又可随时间轻松修改或扩展的应用程序。
1114 0
|
测试技术 Android开发 iOS开发
使用Xamarin.Forms的企业应用程序模式(电子书)--介绍
无论平台如何,企业应用开发人员都面临着几个挑战: 随时间变化的应用程序要求。 新的商机和挑战。 开发期间持续的反馈可能会显着影响应用程序的范围和要求。
1462 0
|
前端开发 测试技术
使用Xamarin.Forms的企业应用程序模式(电子书)--单元测试
移动应用程序具有独特的问题,桌面和基于Web的应用程序不必担心。移动用户将因其使用的设备,网络连接,服务可用性以及一系列其他因素而有所不同。因此,应该测试移动应用程序,因为它们将被用于现实世界,以提高其质量,可靠性和性能。
977 0
|
Web App开发 存储 缓存
使用Xamarin.Forms的企业应用程序模式(电子书)--访问远程数据
许多现代的基于Web的解决方案利用由Web服务器托管的Web服务来为远程客户端应用程序提供功能。 Web服务公开的操作构成Web API。 客户端应用程序应该能够在不知道API暴露的数据或操作如何实现的情况下使用Web API。
1301 0
|
Web App开发 存储 .NET
使用Xamarin.Forms的企业应用程序模式(电子书)--认证和授权
身份验证是从用户获取身份验证凭证(例如姓名和密码)以及根据权限验证这些凭据的过程。如果凭据有效,则提交凭据的实体被认为是认证身份。一旦身份被认证,授权过程将确定该身份是否可以访问给定的资源。
1438 0
|
存储 消息中间件 Docker
使用Xamarin.Forms的企业应用程序模式(电子书)--容器化微服务
开发客户端 - 服务器应用程序的重点是建立在每个层中使用特定技术的分层应用程序。这样的应用通常被称为单片应用,并且被封装在用于峰值负载预分配的硬件上。这种开发方法的主要缺点是每个层级组件之间的紧密耦合,各个组件不能轻易缩放,并且测试成本。
1020 0
使用Xamarin.Forms的企业应用程序模式(电子书)--验证
任何接受用户输入的应用程序都应确保输入有效。 例如,应用程序可以检查仅包含特定范围内的字符的输入,具有一定长度,或匹配特定格式。 没有验证,用户可以提供导致应用失败的数据。 验证强制执行业务规则,并防止攻击者注入恶意数据。
909 0
|
存储 API 容器
使用Xamarin.Forms的企业应用程序模式(电子书)--配置管理
设置允许将配置应用程序行为的数据与代码分离,允许在不重新构建应用程序的情况下更改行为。有两种类型的设置:应用设置和用户设置。 应用设置是应用程序创建和管理的数据。它可以包括固定Web服务端点,API密钥和运行时状态等数据。
1092 0
|
容器
使用Xamarin.Forms的企业应用程序模式(电子书)--依赖注入
通常,在实例化对象时调用类构造函数,并将对象需要的任何值作为参数传递给构造函数。 这是依赖注入的一个例子,具体称为构造函数注入。 对象需要的依赖项被注入到构造函数中。 通过将依赖项指定为接口类型,依赖注入可以使具体类型与依赖于这些类型的代码进行解耦。
1010 0
在Xamarin.Forms企业应用程序中进行验证
我们在五月份发布了一本《使用Xamarin.Forms的企业应用程序模式》的电子书。电子书专注于开发Xamarin.Forms更容易测试,维护和发展的企业应用程序的核心模式和架构指导。
1142 0

热门文章

最新文章