Prism事件聚合器(IEventAggregator)

发布时间 2023-09-03 16:17:52作者: ZHIZRL

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
    }
}