LFlow/LFlow.InternalEventBus/InternalEventBus.cs

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