EventBus是一种消息传递模式,用于在应用程序中实现解耦和异步通信。它通常用于在不同组件之间传递事件,而不需要它们直接相互依赖。这种模式特别适用于基于事件驱动的架构,如UI框架和微服务架构。
EventBus 的基本概念
-
事件:事件是一些发生的事情,通常包含某种数据。事件对象通常包含有关事件的信息。
-
事件发布者:事件发布者是触发事件的组件。当某个事件发生时,发布者会将事件发布到EventBus。
-
事件订阅者:事件订阅者是对某个特定事件感兴趣的组件。订阅者会向EventBus注册自己,以便在事件发生时接收到通知。
-
EventBus:EventBus是中介,它管理事件的发布和订阅。它负责将事件从发布者传递给相应的订阅者。
以下是一个简单的案例分享
首先,定义事件基类以及事件处理器
internal abstract class BaseEvent
{
public BaseEvent()
{
Id = Guid.NewGuid().ToString();
}
public string Id { get; private set; }
}
internal abstract class BaseEventHandler
{
public readonly BaseEvent BEvent;
public BaseEventHandler(BaseEvent baseEvent)
{
BEvent = baseEvent;
}
public abstract Task Handle();
}
定义IEventBus接口:订阅、发布以及接触订阅
internal interface IEventBus
{
void Subscribe<TEvent, TEventHandler>(TEvent @event, TEventHandler @eventHandler) where TEvent : BaseEvent
where TEventHandler : BaseEventHandler;
void Unsubscribe<TEvent, TEventHandler>(TEvent @event, TEventHandler @eventHandler) where TEvent : BaseEvent
where TEventHandler : BaseEventHandler;
void UnsubscribeAll<TEvent>() where TEvent : BaseEvent;
void Publish<TEvent>() where TEvent : BaseEvent;
}
实现事件总线EventBus
internal class EventBus : IEventBus
{
private ConcurrentDictionary<Type, List<BaseEventHandler>> _eventDict = new();
public void Subscribe<TEvent, TEventHandler>(TEvent @event, TEventHandler @eventHandler)
where TEvent : BaseEvent
where TEventHandler : BaseEventHandler
{
if (!_eventDict.ContainsKey(typeof(TEvent)))
{
List<BaseEventHandler> eventHandlers = new()
{
@eventHandler
};
_eventDict.TryAdd(typeof(TEvent), eventHandlers);
}
else
{
_eventDict[typeof(TEvent)].Add(@eventHandler);
}
Console.WriteLine($"Event:{@event.Id} has been subscribe, {typeof(TEvent).Name} Count: {_eventDict[typeof(TEvent)].Count}");
}
public void Publish<TEvent>() where TEvent : BaseEvent
{
if (_eventDict.TryGetValue(typeof(TEvent), out var events))
{
events.ForEach(e =>
{
Console.WriteLine($"{typeof(TEvent).Name} invoke");
e.Handle();
});
}
}
public void Unsubscribe<TEvent, TEventHandler>(TEvent @event, TEventHandler @eventHandler)
where TEvent : BaseEvent
where TEventHandler : BaseEventHandler
{
if (_eventDict.TryGetValue(typeof(TEvent), out var events))
{
events.RemoveAll(e => e.GetHashCode() == @eventHandler.GetHashCode());
Console.WriteLine($"Event:{@event.Id} has been removed, {typeof(TEvent).Name} Count: {events.Count}");
}
}
public void UnsubscribeAll<TEvent>() where TEvent : BaseEvent
{
if (_eventDict.TryRemove(typeof(TEvent), out _))
{
Console.WriteLine($"All {typeof(TEvent).Name} has been removed");
}
}
}
创建TestEvent类,进行测试
internal class TestEvent : BaseEvent
{
public TestEvent(string _message)
{
Message = _message;
}
public string Message { get; private set; }
}
internal class TestEventHandler : BaseEventHandler
{
public TestEventHandler(TestEvent baseEvent) : base(baseEvent)
{
data = baseEvent;
}
public TestEvent data { get; private set; }
public override Task Handle()
{
Console.WriteLine($"Event_Id:{data.Id}, Message:{data.Message}");
return Task.CompletedTask;
}
}
调用,打印结果
internal class Program
{
private static void Main(string[] args)
{
IEventBus eventBus = new EventBus();
TestEvent testEvent = new("Test event `1");
TestEventHandler testEventHandler = new TestEventHandler(testEvent);
eventBus.Subscribe(testEvent, testEventHandler);
testEvent = new TestEvent("Test event `2");
testEventHandler = new TestEventHandler(testEvent);
eventBus.Subscribe(testEvent, testEventHandler);
eventBus.Publish<TestEvent>();
eventBus.Unsubscribe(testEvent, testEventHandler);
Console.ReadLine();
}
}
感谢观看,喜欢的可以收藏,哈哈