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

这篇具有很好参考价值的文章主要介绍了C# 简单模拟 程序内部 消息订阅发布功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

模拟消息订阅发布

在Utils 的MessageHelper
C# 简单模拟 程序内部 消息订阅发布功能,C# 小轮子,c#,java,开发语言

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.Add(action);

            }
            else if(model.Actions.Find(item => item.Equals(action)) == null)
            {
                model.Actions.Add(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.ForEach(item =>
                {
                    item(value);
                });
            }

        }

    }

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

        public string Key { get; set; }

        public List<Action<object>> Actions { get; set; } = new List<Action<object>>();
    }

}


使用

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# 元祖,最佳的临时变量。

为了防止重复注入,我加了判断代码。

更新 2023年8月11日,添加泛型,简化Topic

public class MessageHelper
{
    public static List<Message> Messages = new List<Message>();

    /// <summary>
    /// 消息订阅
    /// </summary>
    public static void Subscribe<T_class>( string key, Action<object> action)where T_class : class
    {
        string topic = typeof(T_class).FullName;
        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.Add(action);

        }
        else if (model.Actions.Find(item => item.Equals(action)) == null)
        {
            model.Actions.Add(action);


        }




    }

    /// <summary>
    /// 消息推送
    /// </summary>
    public static void Publish<T_class>( string key, object value) where T_class : class
    {
        string topic = typeof(T_class).FullName;

        var model = Messages.Where(item => item.Topic == topic && item.Key == key).FirstOrDefault();
        if (model != null)
        {
            model.Actions.ForEach(item =>
            {
                item(value);
            });
        }

    }

}

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

    public string Key { get; set; }

    public List<Action<object>> Actions { get; set; } = new List<Action<object>>();
}
public static void TestBtn(object value)
{
    Console.WriteLine((string)value);
}
static void Main(string[] args)
{
    MessageHelper.Subscribe<Program>("Test", TestBtn);
    MessageHelper.Subscribe<Program>("Test", TestBtn);
    MessageHelper.Subscribe<Program>("Test", TestBtn);
    //订阅我做了去重处理
    MessageHelper.Publish<Program>("Test","测试文本");
    Console.ReadLine();
}

C# 简单模拟 程序内部 消息订阅发布功能,C# 小轮子,c#,java,开发语言文章来源地址https://www.toymoban.com/news/detail-632707.html

到了这里,关于C# 简单模拟 程序内部 消息订阅发布功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp小程序消息订阅功能

    场景描述 微信充电小程序希望在用户充电时间结束,或者用户的充电完成时。通过微信公众号的推送信息的方式,告知用户充电进程。 需求实现 基础API: 实现上面的需求用到API有: uni.getSetting() 、 uni.openSetting() 、核心 uni.requestSubscribeMessage() uniapp官方文档 uni.getSetting():获

    2024年02月12日
    浏览(33)
  • 微信小程序消息订阅功能

    消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验。 订阅消息推送位置:服务通知 订阅消息下发条件:用户自主订阅(用户订阅了才能接收推送的消息) 订阅消息卡片跳转能力:点击查看详情可跳转至该小程序的页

    2024年02月05日
    浏览(34)
  • 微信小程序实现订阅消息功能

             * 源码已经上传到资源处,需要的话点击跳转下载 |  源码下载         小程序中的订阅内容在日常中大家都会使用到,一般在支付的时候,会收到支持成功的消息,里面有一些基础信息花费多少以及是使用在什么地方,订阅消息是小程序向用户发送消息的方式

    2024年02月08日
    浏览(45)
  • 微信小程序服务通知(订阅消息)定时推送消息功能

    首先先说项目需求:向预约参观的用户提前一天晚上8点推送消息。小程序端主要用到的 API 是我是小程序用到的API。以及服务端用到的 API :我是服务端用到的API。 1. 开通订阅消息功能 (1)、 首先需要在小程序管理后台开通订阅消息功能。没开通前如下图所示: (2)、开通之

    2024年02月08日
    浏览(56)
  • 微信小程序订阅消息功能的前后端配置

    功能描述:用户进行弹窗订阅授权后,给用户下发消息通知提醒 使用场景:优惠券过期,会员过期,活动通知等等 前端 获取模版ID 在微信公众平台 一 功能 一 订阅消息 手动配置获取模板 ID:登录 https://mp.weixin.qq.com 获取模板,如果没有合适的模板,可以申请添加新模板,

    2024年04月11日
    浏览(40)
  • 如何为微信小程序添加订阅消息和推送通知功能

    为微信小程序添加订阅消息和推送通知功能是非常有用的,它可以让用户在重要的事件发生时及时地收到通知。在本文中,我们将详细介绍如何为微信小程序添加这两种功能。 一、订阅消息 订阅消息是一种新的消息类型,用户可以选择是否订阅它们。订阅消息一般用于向用

    2024年02月04日
    浏览(57)
  • 微信小程序实现订阅消息功能(Node服务器篇)

            * 源码已经上传到资源处,需要的话点击跳转下载 |  源码下载         在上一篇内容当中在微信小程序中实现订阅消息功能,都在客户端(小程序)中来实现的,在客户端中模拟了服务器端来进行发送订阅消息的功能,那么本篇就将上一篇内容中仅在客户端中实现

    2024年02月03日
    浏览(46)
  • 【物联网】手把手完整实现STM32+ESP8266+MQTT+阿里云+APP应用——第1节-阿里云配置+MQTT.fx模拟与使用AT命令发布订阅消息

    🌟博主领域:嵌入式领域人工智能软件开发 本节目标: 通过MQTT.fx模拟连接或通过串口连接ESP8266发送AT命令,实现阿里云物联网平台发送数据同时接收数据,IOT studio界面显示数据。具体来说:使用ESP8266 ESP-01来连接网络,获取设备数据发送到阿里云物联网平台并显示且oled显

    2024年02月03日
    浏览(36)
  • 微信小程序的订阅消息是一个允许开发者向用户发送重要通知的功能。这里为您展示如何实现小程序订阅消息的基本步骤和代码示例

    步骤 1: 获取模板 ID 首先,您需要登录微信公众平台,进入「小程序管理」后台,找到“设置” “开发设置” “订阅消息”,然后选择并配置所需的模板,记录模板 ID。 步骤 2: 小程序前端请求订阅 在小程序的某个页面或组件中,当用户执行某个操作(例如点击按钮)时,可

    2024年02月04日
    浏览(68)
  • uni-app中实现微信小程序/公众号订阅消息推送功能

    👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是全栈 IT 工程师摘星人 欢迎分享 / 收藏 / 赞 / 在看! 开发业务时时常遇到需要向用户发送一些通知,如欠费通知、会员到期通知等等。

    2024年02月02日
    浏览(90)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包