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

前言

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

模拟消息订阅发布

在Utils 的MessageHelper
在这里插入图片描述

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();
}

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值