文章目录
- 前言
- 模拟消息订阅发布
- 使用
- 注意事项
前言
我想做个简单的消息发布订阅功能,但是发现好像没有现成的工具类。要么就是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# 元祖,最佳的临时变量。
为了防止重复注入,我加了判断代码。