Prism事件聚合器(Event/发布订阅)

什么是Prism事件聚合器#

Prism 库提供了一种事件机制,可以实现应用程序中松散耦合组件之间的通信。这种机制基于事件聚合器服务,允许发布者和订阅者通过事件进行通信,并且彼此之间仍然没有直接引用。简单来说就是提供了一个多播发布/订阅功能。

使用事件聚合器

一图了解Prism的事件聚合器,这玩意实现原理是观察者模式,观察者模式也就是常说的发布/订阅模式。

使用Prism聚合器#

1、创建事件

这里我们创建一个MessageEvent类并继承自PubSubEvent,并传入一个MessageModel对象泛型,也可以传入string,int 等等基础类型

namespace MainModule.Event
{
    public class MessageEvent : PubSubEvent<MessageModel>
    {
    }

    public class MessageModel
    {
        public int Code { get; set; }
        public string Message { get; set; }
        public string Data { get; set; }
    }
}

2、订阅事件

通过构造注入IEventAggregator,并通过IEventAggregator的GetEvent获取定义的消息,再通过Subscribe方法注册,Subscribe是一个委托方法

public MainWindow(IEventAggregator aggregator)
        {
            InitializeComponent();
            _aggregator = aggregator;

            _aggregator.GetEvent<MessageEvent>().Subscribe(ShowMethod, arg => arg.Code == 200); ;
        }

3、发布事件

private readonly IEventAggregator _aggregator;
//构造注入
public MainWindowViewModel(IEventAggregator aggregator)
        {
        _aggregator = aggregator;
        }
//创建一个命令,当执行该命令时执行发布事件的逻辑     
PubSubEventCommand = new DelegateCommand(PubSubEventMessage);

//发布事件方法
private void PubSubEventMessage()
        {
            MessageModel message = new MessageModel
            {
                Code = 200,
                Message = "操作成功",
                Data = "{}"
            };
            _aggregator.GetEvent<MessageEvent>().Publish(message);
        }

这样,一个发布/订阅的事件就完成了,也可以在任何时候取消事件注册,只需要调用Unsubscribe方法即可

_aggregator.GetEvent<MessageEvent>().Unsubscribe(ShowMethod);

由于它是多播的,你可以在任意多个地方进行发布或订阅。

效果图:

4

过滤器#

在真实业务场景中,可能需要达到某个特定要求时才进行注册,这时候我们就可以用到Predicate<TPayload>过滤器

image-20210823221608468

 _aggregator.GetEvent<MessageEvent>().Subscribe(ShowMethod, arg => arg.Code == 200); 

把后面这个参数的过滤变更一下,假设Code值为500,打个断点看一下

3

可以看出,不满足过滤器的条件时,即使发布了事件,注册事件的委托方法也不会被触发执行。

有兴趣可以去学习下观察者模式,此前有一篇文章也类似于这种写法,当然肯定是没有这个写的出神入化,传送门:观察者模式的"最佳实践"

本文的示例代码在该github仓库:https://github.com/luchong0813/PrismLearning

作者:傲慢与偏见

出处:https://www.cnblogs.com/chonglu/p/15178033.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

声明:如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧

posted @   傲慢与偏见luc  阅读(6584)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示