C# 简单模拟 程序内部 消息订阅发布功能

文章目录

前言

我想做个简单的消息发布订阅功能,但是发现好像没有现成的工具类。要么就是Mqtt这种消息订阅发布。但是我只想程序内部进行消息订阅发布,进行程序的解耦。那没办法了,只能自己上了

模拟消息订阅发布

在Utils 的MessageHelper

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NetCore.Utils
{
    public class MessageHelper
    {
        public static List<Message> Messages = new List<Message>();

        /// <summary>
        /// 消息订阅
        /// </summary>
        public static void Subscribe(string topic,string key, Action<object> action)
        {
            var model = Messages.Where(item => item.Topic == topic && item.Key == key).FirstOrDefault();
            if (model == null)
            {
                model = new Message()
                {
                    Topic = topic,
                    Key = key,

                };

                Messages.Add(model);
            }

            model.Actions += action;

        }

        /// <summary>
        /// 消息推送
        /// </summary>
        public static void Publish(string topic,string key,object value)
        {
            var model = Messages.Where(item => item.Topic == topic && item.Key == key).FirstOrDefault();
            if (model != null)
            {
                model.Actions(value);
            }

        }

    }

    public class Message
    {
        public string Topic { get; set; }

        public string Key { get; set; }

        public Action<object> Actions { get; set; }
    }
}

使用

csharp 复制代码
static void Main(string[] args)
{
     MessageHelper.Subscribe("Topic1", "key1", (res) =>
     {
         var _res = ((string Name, int Age))res;
         Console.WriteLine(_res.ToString());
         Console.WriteLine("我被调用了1");
     });
     MessageHelper.Subscribe("Topic2", "key1", (res) =>
     {
         Console.WriteLine("我被调用了2");

     });
     MessageHelper.Subscribe("Topic3", "key1", (res) =>
     {
         Console.WriteLine("我被调用了3");

     });
     MessageHelper.Subscribe("Topic4", "key1", (res) =>
     {
         Console.WriteLine("我被调用了4");

     });
     MessageHelper.Publish("Topic1","key1",(Name:"嘟嘟",Sex:"12"));
     Console.ReadLine();
 }

注意事项

这里我用了元祖来进行临时变量的传值。元祖如何使用请看我的另一篇文章。元祖用来做临时变量特别好用

C# 元祖,最佳的临时变量。

相关推荐
EatFan几秒前
一个二维码背后的系统设计:批次生成、绑定、扫码与数据统计怎么做?
java·后端·微信小程序·二维码·qrcode
白远山几秒前
自助健身小程序源码:架构拆解、核心链路与本地部署实战
java·架构·uni-app·需求分析
专注仿真11 分钟前
CMO模型文档-活动单元基类
c#·模型·cmo·活动单元基类
小灰灰搞电子18 分钟前
Rust Once 、OnceLock、LazyLock 一次性初始化详解
开发语言·后端·rust
Lyyaoo.23 分钟前
【动态规划】【待更新】
java·数据结构·算法
hqyjzsb26 分钟前
规划工商管理大学成长:搭建四层能力体系,重视高阶的 AI 能力建设
开发语言·人工智能·python·microsoft·职场和发展·数据挖掘·业界资讯
我不会起名字32232 分钟前
一天一道算法题(35):电话号码的字母组合
java·数据结构·后端·python·leetcode·go·回溯
麻瓜code34 分钟前
【JUC】基础:并发模型、锁机制与 JMM
java
曹牧37 分钟前
SpringBoot: @RequestBody String
java
for_ever_love__1 小时前
爬虫项目: 获取高分电影的数据总结
开发语言·python·学习