123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- namespace PCC2.EventBus;
- public abstract class InProcessAsyncEventBusBase(ILogger<InProcessAsyncEventBusBase> logger) : IAsyncEventBus
- {
- private readonly Dictionary<Type, HashSet<Delegate>> _dicTypeToHandlers = [];
- public bool Subscript<T>(Func<T, Task> callBack)
- {
- var type = typeof(T);
- lock (_dicTypeToHandlers)
- {
- if (!_dicTypeToHandlers.TryGetValue(type, out var handlers))
- {
- handlers = _dicTypeToHandlers[type] = [];
- }
- return handlers.Add(callBack); // 忽略重复
- }
- }
- public bool UnSubscript<T>(Func<T, Task> callBack)
- {
- lock (_dicTypeToHandlers)
- {
- if (_dicTypeToHandlers.TryGetValue(typeof(T), out var handlers))
- {
- var unSubscript = handlers.Remove(callBack);
- if (handlers.Count == 0) _dicTypeToHandlers.Remove(typeof(T));
- return unSubscript;
- }
- return false;
- }
- }
- public async Task<bool> PublishAsync<T>()
- {
- await PublishInternalAsync(new AnyPublishEvent(typeof(T), default));
- return await PublishInternalAsync<T?>(default);
- }
- public async Task<bool> PublishAsync<T>(T obj)
- {
- await PublishInternalAsync(new AnyPublishEvent(typeof(T), obj));
- return await PublishInternalAsync(obj);
- }
- private async Task<bool> PublishInternalAsync<T>(T eventValue)
- {
- var type = typeof(T);
- Delegate[] subscripts;
- lock (_dicTypeToHandlers)
- {
- if (!_dicTypeToHandlers.TryGetValue(type, out var handlers)) return false;
- subscripts = [.. handlers];
- }
- foreach (var del in subscripts)
- {
- try
- {
- await ((Func<T, Task>)del)(eventValue);
- }
- catch (Exception e)
- {
- logger.LogError(e, nameof(PublishAsync));
- }
- }
- return true;
- }
- }
|