Files
EBoard/电子展板/Utility/EventBus.cs
2025-09-22 14:30:54 +08:00

216 lines
5.6 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
namespace .Utility
{
public class EventBus
{
private static object _lock = new object();
private List<CallBacks> list;
private List<StrCallBacks> strlist;
/// <summary>
/// 单例,防止实例化
/// </summary>
private EventBus()
{
list = new List<CallBacks>();
strlist = new List<StrCallBacks>();
}
private static EventBus _instance;
/// <summary>
/// 获取实例
/// </summary>
public static EventBus Instance
{
get
{
if (_instance == null)
{
_instance = new EventBus();
return _instance;
}
return _instance;
}
}
/// <summary>
/// 订阅消息obj这个对象订阅T这个消息发布消息时调用回调方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <param name="callBackFunc"></param>
public void Subscribe<T>(object obj, Action<T> callBackFunc) where T : IEvent
{
try
{
//判断有没有注册过,注册过就不能再注册。疑惑点,一个类中多次注册行不行??
if (list.Any(it => it.Subscriber == obj && it.EventType == typeof(T)))
{
return;
}
list.Add(new CallBacks
{
Subscriber = obj,
EventType = typeof(T),
Action = new Action<object>(o => callBackFunc((T)o))
});
}
catch (Exception ex)
{
}
}
/// <summary>
/// 取消订阅obj这个对象取消订阅T这个消息
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
public void UnSubscribe<T>(object obj) where T : IEvent
{
try
{
list.RemoveAll(it => it.Subscriber == obj && it.EventType == typeof(T));
}
catch (Exception ex)
{
}
}
/// <summary>
/// 发布消息
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="data"></param>
public void Publish<T>(T data) where T : IEvent
{
list.Where(it => it.EventType == typeof(T)).ToList().ForEach(it =>
{
//Task.Run(() => it.Action(data));
try
{
it.Action(data);
}
catch (Exception ex)
{
}
});
}
public void Subscribe(object obj, string eventName, Action<string> callBackFunc)
{
try
{
//判断有没有注册过,注册过就不能再注册。疑惑点,一个类中多次注册行不行??
if (strlist.Any(it => it.Subscriber == obj && it.EventName == eventName))
{
return;
}
strlist.Add(new StrCallBacks
{
Subscriber = obj,
EventName = eventName,
Action = callBackFunc
});
}
catch (Exception ex)
{
}
}
public void UnSubscribe(object obj, string eventName)
{
try
{
strlist.RemoveAll(it => it.Subscriber == obj && it.EventName == eventName);
}
catch (Exception ex)
{
}
}
public void Publish(string eventName, string data)
{
try
{
strlist.Where(it => it.EventName == eventName).ToList().ForEach(it =>
{
it.Action(data);
});
}
catch (Exception ex)
{
}
}
/// <summary>
/// 内部类
/// </summary>
class CallBacks
{
/// <summary>
/// T的类型
/// </summary>
public Type EventType { get; set; }
/// <summary>
/// 谁订阅对象
/// </summary>
public object Subscriber { get; set; }
public Action<object> Action { get; set; }
}
class StrCallBacks
{
/// <summary>
/// T的类型
/// </summary>
public string EventName { get; set; }
/// <summary>
/// 谁订阅对象
/// </summary>
public object Subscriber { get; set; }
public Action<string> Action { get; set; }
}
}
public interface IEvent { }
public class ConsoleLogEvent : IEvent
{
public DateTime DateTime { get; set; }
public string Message { get; set; }
public string Type { get; set; }
public ConsoleLogEvent(string message) : this("I", message)
{
}
public ConsoleLogEvent(string type, string message)
{
this.Type = type;
this.Message = message;
this.DateTime = DateTime.Now;
}
public override string ToString()
{
return $"{DateTime.ToString("yyyy-MM-dd HH:mm:ss.fff")}[{Type}]->{Message}";
}
}
public class ClearLogEvent : IEvent
{
}
}