
事件总线一、核心功能事件总线是 Furion.Pure 框架提供的发布-订阅模式实现用于解耦应用中的各个模块实现事件驱动架构。1.1 核心价值模块解耦发布者和订阅者互不依赖异步处理支持异步事件处理提高系统响应速度多订阅者同一事件可以有多个订阅者模糊匹配支持事件名称模糊匹配可扩展性支持自定义事件源存储和发布者二、基本概念2.1 事件源 (EventSource)事件源是事件的载体包含事件名称、数据和元信息publicinterfaceIEventSource{/// summary/// 事件 ID/// /summarystringEventId{get;}/// summary/// 事件名称/// /summarystringEventName{get;}/// summary/// 事件数据/// /summaryobjectPayload{get;}/// summary/// 事件创建时间/// /summaryDateTimeCreatedTime{get;}/// summary/// 是否异步执行/// /summaryboolIsAsync{get;}}2.2 事件发布者 (EventPublisher)事件发布者负责将事件发送到事件总线publicinterfaceIEventPublisher{/// summary/// 发布事件/// /summary/// param nameeventSource事件源/paramTaskPublishAsync(IEventSourceeventSource);}2.3 事件订阅者 (EventSubscriber)事件订阅者负责处理订阅的事件publicinterfaceIEventSubscriber{/// summary/// 订阅事件/// /summary/// param nameeventName事件名称/param/// param namehandler事件处理器/paramvoidSubscribe(stringeventName,FuncEventHandlerExecutingContext,Taskhandler);/// summary/// 取消订阅/// /summary/// param nameeventName事件名称/paramvoidUnsubscribe(stringeventName);}三、实现流程3.1 服务注册在Startup.cs中调用services.AddEventBus();注册逻辑步骤操作说明1注册事件源存储添加ChannelEventSourceStorer内存通道2注册事件发布者添加ChannelEventPublisher3注册事件总线工厂添加EventBusFactory4注册后台服务添加EventBusHostedService3.2 事件发布流程┌─────────────────────────────────────────────────────────────┐ │ 事件发布阶段 │ ├─────────────────────────────────────────────────────────────┤ │ 1. 创建事件源 │ │ └── new ChannelEventSource(UserCreated, data) │ ├─────────────────────────────────────────────────────────────┤ │ 2. 调用 IEventPublisher.PublishAsync() │ │ └── 将事件源存储到 ChannelEventSourceStorer │ ├─────────────────────────────────────────────────────────────┤ │ 3. EventBusHostedService 监听通道 │ │ └── 发现新事件源并触发处理 │ └─────────────────────────────────────────────────────────────┘3.3 事件处理流程┌─────────────────────────────────────────────────────────────┐ │ 事件处理阶段 │ ├─────────────────────────────────────────────────────────────┤ │ 1. 匹配事件订阅者 │ │ └── 根据事件名称查找订阅者 │ ├─────────────────────────────────────────────────────────────┤ │ 2. 创建事件处理上下文 │ │ └── EventHandlerExecutingContext │ ├─────────────────────────────────────────────────────────────┤ │ 3. 执行事件处理器 │ │ └── 调用订阅者注册的处理方法 │ ├─────────────────────────────────────────────────────────────┤ │ 4. 记录处理结果 │ │ └── EventHandlerExecutedContext │ └─────────────────────────────────────────────────────────────┘四、使用示例4.1 定义事件源publicclassUserCreatedEvent:ChannelEventSource{publicUserCreatedEvent(UserInfouser):base(UserCreated,user){}}4.2 发布事件publicclassUserService{privatereadonlyIEventPublisher_eventPublisher;publicUserService(IEventPublishereventPublisher){_eventPublishereventPublisher;}publicasyncTaskCreateUser(UserInfouser){// 创建用户逻辑await_eventPublisher.PublishAsync(newUserCreatedEvent(user));}}4.3 订阅事件特性方式使用[EventSubscribe]特性订阅事件[EventSubscribe(UserCreated)]publicclassUserCreatedHandler{publicasyncTaskHandle(EventHandlerExecutingContextcontext){varusercontext.PayloadasUserInfo;// 处理用户创建事件}}4.4 订阅事件代码方式使用IEventSubscriber订阅事件publicclassEventController{privatereadonlyIEventSubscriber_eventSubscriber;publicEventController(IEventSubscribereventSubscriber){_eventSubscribereventSubscriber;}publicvoidSubscribe(){_eventSubscriber.Subscribe(UserCreated,asynccontext{varusercontext.PayloadasUserInfo;// 处理用户创建事件});}}五、配置选项EventBusOptionsBuilder提供了丰富的配置项配置项默认值说明ChannelCapacity10000通道容量UseUtcTimestampfalse是否使用 UTC 时间FuzzyMatchfalse是否启用模糊匹配GCCollectfalse是否启用垃圾回收LogEnabledtrue是否启用日志5.1 配置示例services.AddEventBus(options{options.ChannelCapacity10000;options.FuzzyMatchtrue;options.LogEnabledtrue;});六、高级特性6.1 模糊匹配启用模糊匹配后可以使用通配符订阅事件[EventSubscribe(User.*)]publicclassUserEventHandler{publicasyncTaskHandle(EventHandlerExecutingContextcontext){// 处理所有 User 开头的事件}}6.2 异步执行事件处理器默认异步执行可以通过IsAsync属性控制publicclassUserCreatedEvent:ChannelEventSource{publicUserCreatedEvent(UserInfouser):base(UserCreated,user,isAsync:true){}}6.3 事件监听实现IEventHandlerMonitor接口监听事件处理publicclassEventMonitor:IEventHandlerMonitor{publicvoidOnExecuting(EventHandlerExecutingContextcontext){// 事件处理开始}publicvoidOnExecuted(EventHandlerExecutedContextcontext){// 事件处理完成}}6.4 失败策略实现IEventFallbackPolicy接口自定义失败处理策略publicclassRetryFallbackPolicy:IEventFallbackPolicy{publicasyncTaskHandleAsync(EventHandlerExecutingContextcontext,Exceptionexception){// 重试或其他失败处理逻辑}}6.5 自定义事件源存储实现IEventSourceStorer接口自定义事件源存储publicclassRedisEventSourceStorer:IEventSourceStorer{publicValueTaskWriteAsync(IEventSourceeventSource){// 写入 Redis}publicIAsyncEnumerableIEventSourceReadAllAsync(){// 从 Redis 读取}}6.6 消息中心使用MessageCenter简化事件发布// 发布事件awaitMessageCenter.PublishAsync(UserCreated,user);// 订阅事件MessageCenter.Subscribe(UserCreated,async(payload){varuserpayloadasUserInfo;// 处理事件});七、核心文件文件说明EventBusServiceCollectionExtensions.cs事件总线服务扩展方法IEventSource.cs事件源接口ChannelEventSource.cs内存通道事件源IEventPublisher.cs事件发布者接口ChannelEventPublisher.cs内存通道事件发布者IEventSubscriber.cs事件订阅者接口IEventSourceStorer.cs事件源存储接口ChannelEventSourceStorer.cs内存通道事件源存储EventSubscribeAttribute.cs事件订阅特性EventBusHostedService.cs事件总线后台服务MessageCenter.cs消息中心八、总结事件总线通过发布-订阅模式实现了模块间的解耦核心设计思想发布-订阅模式发布者和订阅者互不依赖通过事件总线通信异步处理默认异步执行事件处理器提高系统响应速度多订阅者支持同一事件可以有多个订阅者实现广播效果模糊匹配支持事件名称模糊匹配灵活订阅相关事件高度可扩展支持自定义事件源存储、发布者和失败策略这种设计使得应用中的各个模块可以独立开发和测试提高了系统的可维护性和扩展性。