216 lines
5.6 KiB
C#
216 lines
5.6 KiB
C#
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
|
||
{
|
||
}
|
||
}
|