69 lines
2.2 KiB
C#
69 lines
2.2 KiB
C#
using LFlow.InternalEventBus.Interface;
|
|
using System.Collections.Concurrent;
|
|
|
|
namespace LFlow.InternalEventBus
|
|
{
|
|
public class InternalEventBus
|
|
{
|
|
private static readonly ConcurrentDictionary<string, List<IInternalEventSubscriber>> _eventSubscriberDict = new();
|
|
/// <summary>
|
|
/// 注册事件
|
|
/// </summary>
|
|
/// <param name="eventName"></param>
|
|
/// <param name="subscriber"></param>
|
|
public static void Register(string eventName, IInternalEventSubscriber subscriber)
|
|
{
|
|
if (!_eventSubscriberDict.ContainsKey(eventName))
|
|
{
|
|
_eventSubscriberDict.TryAdd(eventName, []);
|
|
}
|
|
_eventSubscriberDict[eventName].Add(subscriber);
|
|
}
|
|
/// <summary>
|
|
/// 取消注册事件
|
|
/// </summary>
|
|
/// <param name="eventName"></param>
|
|
/// <param name="subscriber"></param>
|
|
public static void UnRegister(string eventName, IInternalEventSubscriber subscriber)
|
|
{
|
|
if (_eventSubscriberDict.ContainsKey(eventName))
|
|
{
|
|
_eventSubscriberDict[eventName].Remove(subscriber);
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 发布事件
|
|
/// </summary>
|
|
/// <param name="eventName"></param>
|
|
/// <param name="data"></param>
|
|
/// <returns></returns>
|
|
public static async void Publish(string eventName, object data)
|
|
{
|
|
if (_eventSubscriberDict.ContainsKey(eventName))
|
|
{
|
|
foreach (var subscriber in _eventSubscriberDict[eventName].OrderBy(i => i.Priority))
|
|
{
|
|
var isContinue = await subscriber.Handle(data);
|
|
if (!isContinue)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 发布事件
|
|
/// </summary>
|
|
/// <param name="eventName"></param>
|
|
/// <param name="data"></param>
|
|
/// <returns></returns>
|
|
public static async Task PublishAsync(string eventName, object data)
|
|
{
|
|
await Task.Factory.StartNew(() => Publish(eventName, data));
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|