首页 > 其他分享 >Prism事件聚合器(IEventAggregator)

Prism事件聚合器(IEventAggregator)

时间:2023-09-03 16:23:59浏览次数:33  
标签:IEventAggregator 订阅 聚合 Prism 线程 事件 发布者 event

Prism 库提供了一种事件机制,可以在应用程序中松散耦合的组件之间进行通信。这种机制,基于事件聚合器服务,允许发布者和订阅者通过事件进 行通信,并且彼此之间仍然没有直接的引用。

EventAggregator 提供复合发布/订阅功能。这意味着可以有多个发布者引发相同的事件,并且可以有多个订阅者监听相同的事件。主要用于跨模块 以及业务逻辑代码之间发送消息。

IEventAggregator 接口

通过 IEventAggregator 接口,事件聚合器负责定位或构建事件,并负责在系统中保存事件的集合。 

namespace Prism.Events
{
    //
    // 摘要:
    // 定义获取事件类型实例的接口。
    public interface IEventAggregator
    {
    //
    // 摘要:
    // 获取事件类型的实例。
    //
    // 类型参数:
    // TEventType:
    // 要获取的事件类型。
    //
    // 返回结果:
    // 类型为TEventType的事件对象的实例。
    TEventType GetEvent<TEventType>() where TEventType : EventBase, new();
    }
}

如果 EventAggregator 尚未构造事件,则在第一次访问时构造事件。这使发布者或订阅者无需确定事件是否可用。

创建事件 

连接 Publisher 和 Subscriber 的真正工作是由 PubSubEvent 类完成的。 PubSubEvent 是 Prism 库中 EventBase 类的唯一实现。此类旨在维护订 阅者列表,并处理向订阅者分发的事件。

该类 PubSubEvent 是一个泛型类,需要将有效负载类型定义为泛型类型。这有助于在编译时强制发布者和订阅者为成功的事件连接提供正确的方 法。以下代码显示了 PubSubEvent 类的部分定义。

PubSubEvent 旨在成为应用程序或模块特定事件的基类。 TPayLoad 是事件有效负载的类型。 TPayload 是事件发布时将传递给订阅者 的参数。

发布事件 

发布者通过从EventAggregator的 GetEvent 中检索事件, 并调用 Publish 方法来引发事件。要访问 EventAggregator ,可以通过向类 构造函数添加 IEventAggregator 类型参数来使用依赖注入。

Subscribe 方法可以用于订阅 基于 PubSubEvent 的消息事件 。

运行结果如下所示

订阅 UI 线程

默认情况下,订阅者在发布者的线程上接收事件。如果发布者从 UI 线程发送事件,订阅者可以更新 UI。但是,如果发布者的线程是后台线程,订阅者可能无法直接更新 UI 元素。在这种情况下,订阅者需要使用 Dispatcher 类在 UI 线程上安排更新。

PubSubEvent提供的 Prism 库可以通过允许订阅者在 UI 线程上自动接收事件来提供帮助。订阅者在订阅期间会指出这一点,如以下代码示例所示。

  • PublisherThread:使用此设置接收发布者线程上的事件。这是默认设置。
  • BackgroundThread:使用此设置异步接收 .NET Framework 线程池线程上的事件。
  • UIThread:使用此设置在 UI 线程上接收事件。

消息过滤

订阅者可能不需要处理已发布事件的每个实例。在这些情况下,订阅者可以使用 filter 过滤器参数。通常,此过滤器作为 lambda 表达式提供,如以下代码示例所示。

取消订阅 

如果您的订阅者不再希望接收事件,您可以使用订阅者的处理程序取消订阅,也可以使用订阅令牌取消订阅。

以下代码示例显示了如何直接取消订阅处理程序。

public class MainPageViewModel
{
    TickerSymbolSelectedEvent _event;
    public MainPageViewModel(IEventAggregator ea)
    {
    _event = ea.GetEvent<TickerSymbolSelectedEvent>();
    _event.Subscribe(ShowNews);
    }
    void Unsubscribe()
    {
    _event.Unsubscribe(ShowNews);
    }
    void ShowNews(string companySymbol)
    {
    //implement logic
    }
}

以下代码示例显示如何使用订阅令牌取消订阅。令牌作为方法的返回值提供 Subscribe 。

public class MainPageViewModel
{
    TickerSymbolSelectedEvent _event;
    SubscriptionToken _token;
    public MainPageViewModel(IEventAggregator ea)
    {
    _event = ea.GetEvent<TickerSymbolSelectedEvent>();
    _token = _event.Subscribe(ShowNews);
    }
    void Unsubscribe()
    {
    _event.Unsubscribe(_token);
    }
    void ShowNews(string companySymbol)
    {
    //implement logic
    }
}

标签:IEventAggregator,订阅,聚合,Prism,线程,事件,发布者,event
From: https://www.cnblogs.com/ZHIZRL/p/17675104.html

相关文章

  • Prism区域和模块化(Region & Module)
    Prism一直是围绕依赖注入构建的。这有助于您构建可维护和可测试的应用程序,并帮助您减少或消除对静态和循环引用的依赖。Prism区域概念(Region)什么是区域(Region)区域(Region)作为Prism当中模块化的核心功能,其主要目的是弱化了模块与模块之间的耦合关系。在普遍的应用程序开发中,界面......
  • PrismMVVM功能实现(通知、命令)
    常见的MVVM框架,基本围绕ICommand、INotifyPropertyChanged的封装实现绑定、通知等功能;而对于不同框架,在实现相同功能上,只是表现的形式有所不同,下图列举几种常见框架的功能区别:功能\框架PrismMVVMLightMicorsoft.Tookit.Mvvm通知BindableBaseViewModelBaseObservableO......
  • 这才是BGP的聚合!!!
    BGP聚合:作用:减少肯干路由器路由条目;提高肯干稳定减少震荡分类:第三项选路:手动>自动>自己network>自2import>从其他邻居学习到的1.自动聚合:summaryautomatic公认任意只能聚合本台设备引入的,对自己network和其他设备引入的路由无效聚合后会产生一条、有类的聚合后的路由聚......
  • Prism项目初始化与项目结构
    Prism简介Prism框架适用于WPF和XamarinForms中构建松散耦合、可维护和可测试的应用程序。Prism提供了一组设计模式的实现,这些设计模式有助于编写结构良好且可维护的xaml应用程序,功能包括:视图模型定位器(ViewModelLocation)MVVM(通知)命令(Commands)事件聚合器(EventAggr......
  • Prism视图模型定位器(ViewModelLocator)
    视图模型定位器(ViewModelLocator)依照“标准命名约定”将视图(View)中的数据上下文链接到视图模型(ViewModel)的实例。自动绑定视图模型Prism视图模型定位器(ViewModelLocator)有一个AutoWireViewModel属性:当设置为true时,AutoWireViewModelChanged事件调用类中的ViewMod......
  • 关于DDD中聚合设计的思考(以博客园为例)
    前言聚合作为领域模型中重要的业务功能单元,它的设计是领域建模过程中非常重要的工作。其中聚合根的判断并非一件易事,往往给人一种似是而非的感觉,让人难以捉摸,陷入两难的境地。今天笔者就想以博客园为例来探讨下:博客(Blog)和评论(Comment)究竟是不是一个聚合?问题探讨众所周......
  • 粉状聚合物分散剂行业市场调查趋势分析报告2023-2029
    2023-2029全球粉状聚合物分散剂行业调研及趋势分析报告2022年全球粉状聚合物分散剂市场规模约亿元,2018-2022年年复合增长率CAGR约为%,预计未来将持续保持平稳增长的态势,到2029年市场规模将接近亿元,未来六年CAGR为%。从核心市场看,中国粉状聚合物分散剂市场占据全球约%的市场份......
  • Prism对话框之自定义DialogWindow
    Prism对话框之自定义DialogWindow1.自定义DialogWindow窗体样式(1)定义DialogWindow窗体类,注意要实现IDialogWindow///<summary>///CustomDialogWindow.xaml的交互逻辑///</summary>publicpartialclassCustomDialogWindow:Window,IDialogWindow{publicIDi......
  • DQL-聚合函数
       ......
  • 华为ENSP学习之链路聚合
    作用:合并多条物理链路,形成一条逻辑链路,从而增加带宽,解决网络瓶颈问题 基本思路两种:(一)挨个端口设置聚合:1、创建聚合状态2、设置聚合状态的类型3、进入相应接口,将聚合状态应用到接口(二)聚合内批量添加:1、创建聚合状态2、设置聚合状态的类型3、进入聚合状态内,批量添加结构到......