using System.Collections.Concurrent;
using GFramework.Core.Abstractions.Events;
namespace GFramework.Core.Events;
///
/// 增强的事件总线,支持统计和过滤器
/// 线程安全:使用 ConcurrentDictionary 存储事件
///
public sealed class EnhancedEventBus : IEventBus
{
private readonly EasyEvents _mEvents = new();
private readonly ConcurrentDictionary _mFilterableEvents = new();
private readonly EasyEvents _mPriorityEvents = new();
private readonly ConcurrentDictionary _mWeakEvents = new();
private readonly EventStatistics? _statistics;
///
/// 构造函数
///
/// 是否启用统计功能
public EnhancedEventBus(bool enableStatistics = false)
{
_statistics = enableStatistics ? new EventStatistics() : null;
}
///
/// 获取事件统计信息(如果启用)
///
public IEventStatistics? Statistics => _statistics;
#region IEventBus Implementation
///
/// 发送指定类型的事件实例(自动创建默认实例)
///
/// 事件类型
public void Send() where T : new()
{
_statistics?.RecordPublish(typeof(T).Name);
_mEvents
.GetOrAddEvent>()
.Trigger(new T());
}
///
/// 发送指定类型的事件实例
///
/// 事件类型
/// 事件实例
public void Send(T e)
{
_statistics?.RecordPublish(typeof(T).Name);
_mEvents
.GetOrAddEvent>()
.Trigger(e);
}
///
/// 发送具有指定传播方式的优先级事件
///
/// 事件类型
/// 事件实例
/// 事件传播方式
public void Send(T e, EventPropagation propagation)
{
_statistics?.RecordPublish(typeof(T).Name);
_mPriorityEvents
.GetOrAddEvent>()
.Trigger(e, propagation);
}
///
/// 注册事件监听器
///
/// 事件类型
/// 事件处理回调
/// 反注册接口,用于取消订阅
public IUnRegister Register(Action onEvent)
{
if (_statistics != null)
{
// 包装回调以添加统计
Action wrappedHandler = data =>
{
try
{
onEvent(data);
_statistics.RecordHandle();
}
catch
{
_statistics.RecordFailure();
throw;
}
};
var unregister = _mEvents.GetOrAddEvent>().Register(wrappedHandler);
UpdateEventListenerCount();
return new DefaultUnRegister(() =>
{
unregister.UnRegister();
UpdateEventListenerCount();
});
}
return _mEvents.GetOrAddEvent>().Register(onEvent);
}
///
/// 注册具有优先级的监听器
///
/// 事件类型
/// 事件处理回调
/// 优先级,数值越大优先级越高
/// 反注册接口,用于取消订阅
public IUnRegister Register(Action onEvent, int priority)
{
if (_statistics != null)
{
// 包装回调以添加统计
Action wrappedHandler = data =>
{
try
{
onEvent(data);
_statistics.RecordHandle();
}
catch
{
_statistics.RecordFailure();
throw;
}
};
var unregister = _mPriorityEvents.GetOrAddEvent>().Register(wrappedHandler, priority);
UpdatePriorityEventListenerCount();
return new DefaultUnRegister(() =>
{
unregister.UnRegister();
UpdatePriorityEventListenerCount();
});
}
return _mPriorityEvents.GetOrAddEvent>().Register(onEvent, priority);
}
///
/// 注销事件监听器
///
/// 事件类型
/// 事件处理回调
public void UnRegister(Action onEvent)
{
_mEvents.GetEvent>().UnRegister(onEvent);
UpdateEventListenerCount();
}
///
/// 注册带有上下文信息的优先级事件监听器
///
/// 事件类型
/// 事件处理回调,接收事件上下文
/// 反注册接口,用于取消订阅
public IUnRegister RegisterWithContext(Action> onEvent)
{
if (_statistics != null)
{
// 包装回调以添加统计
Action> wrappedHandler = context =>
{
try
{
onEvent(context);
_statistics.RecordHandle();
}
catch
{
_statistics.RecordFailure();
throw;
}
};
var unregister = _mPriorityEvents.GetOrAddEvent>().RegisterWithContext(wrappedHandler);
UpdatePriorityEventListenerCount();
return new DefaultUnRegister(() =>
{
unregister.UnRegister();
UpdatePriorityEventListenerCount();
});
}
return _mPriorityEvents.GetOrAddEvent>().RegisterWithContext(onEvent);
}
///
/// 注册带有上下文信息和优先级的监听器
///
/// 事件类型
/// 事件处理回调,接收事件上下文
/// 优先级,数值越大优先级越高
/// 反注册接口,用于取消订阅
public IUnRegister RegisterWithContext(Action> onEvent, int priority)
{
if (_statistics != null)
{
// 包装回调以添加统计
Action> wrappedHandler = context =>
{
try
{
onEvent(context);
_statistics.RecordHandle();
}
catch
{
_statistics.RecordFailure();
throw;
}
};
var unregister = _mPriorityEvents.GetOrAddEvent>()
.RegisterWithContext(wrappedHandler, priority);
UpdatePriorityEventListenerCount();
return new DefaultUnRegister(() =>
{
unregister.UnRegister();
UpdatePriorityEventListenerCount();
});
}
return _mPriorityEvents.GetOrAddEvent>().RegisterWithContext(onEvent, priority);
}
#endregion
#region Filterable Events
///
/// 发送支持过滤的事件
///
/// 事件类型
/// 事件实例
public void SendFilterable(T e)
{
var evt = (FilterableEvent)_mFilterableEvents.GetOrAdd(
typeof(T),
_ => new FilterableEvent(_statistics));
evt.Trigger(e);
}
///
/// 注册支持过滤的事件监听器
///
/// 事件类型
/// 事件处理回调
/// 反注册接口
public IUnRegister RegisterFilterable(Action onEvent)
{
var evt = (FilterableEvent)_mFilterableEvents.GetOrAdd(
typeof(T),
_ => new FilterableEvent(_statistics));
return evt.Register(onEvent);
}
///
/// 为指定事件类型添加过滤器
///
/// 事件类型
/// 过滤器
public void AddFilter(IEventFilter filter)
{
var evt = (FilterableEvent)_mFilterableEvents.GetOrAdd(
typeof(T),
_ => new FilterableEvent(_statistics));
evt.AddFilter(filter);
}
///
/// 移除指定事件类型的过滤器
///
/// 事件类型
/// 过滤器
public void RemoveFilter(IEventFilter filter)
{
if (_mFilterableEvents.TryGetValue(typeof(T), out var obj))
{
var evt = (FilterableEvent)obj;
evt.RemoveFilter(filter);
}
}
///
/// 清除指定事件类型的所有过滤器
///
/// 事件类型
public void ClearFilters()
{
if (_mFilterableEvents.TryGetValue(typeof(T), out var obj))
{
var evt = (FilterableEvent)obj;
evt.ClearFilters();
}
}
#endregion
#region Weak Events
///
/// 发送弱引用事件
///
/// 事件类型
/// 事件实例
public void SendWeak(T e)
{
var evt = (WeakEvent)_mWeakEvents.GetOrAdd(
typeof(T),
_ => new WeakEvent(_statistics));
evt.Trigger(e);
}
///
/// 注册弱引用事件监听器
///
/// 事件类型
/// 事件处理回调
/// 反注册接口
public IUnRegister RegisterWeak(Action onEvent)
{
var evt = (WeakEvent)_mWeakEvents.GetOrAdd(
typeof(T),
_ => new WeakEvent(_statistics));
return evt.Register(onEvent);
}
///
/// 清理指定事件类型的已回收弱引用
///
/// 事件类型
public void CleanupWeak()
{
if (_mWeakEvents.TryGetValue(typeof(T), out var obj))
{
var evt = (WeakEvent)obj;
evt.Cleanup();
}
}
#endregion
#region Helper Methods
///
/// 更新普通事件的监听器数量统计
///
private void UpdateEventListenerCount()
{
if (_statistics == null)
return;
var evt = _mEvents.GetEvent>();
if (evt != null)
{
var count = evt.GetListenerCount();
_statistics.UpdateListenerCount(typeof(T).Name, count);
}
}
///
/// 更新优先级事件的监听器数量统计
///
private void UpdatePriorityEventListenerCount()
{
if (_statistics == null)
return;
var evt = _mPriorityEvents.GetEvent>();
if (evt != null)
{
var count = evt.GetListenerCount();
_statistics.UpdateListenerCount(typeof(T).Name, count);
}
}
#endregion
}