SuperAPI AI 工具集

The Standard Events

编程与开发

查看项目

更新于 10-15 22:12

技能介绍

用途:在遵循 The Standard 的项目中,规范服务间事件驱动通信的架构、实现与测试,覆盖如何发布领域事件、如何订阅事件,以及事件服务的验证与失败处理。适用于实现、评审、扩展或测试事件通信,也用于判断某服务是否适合 CulDeSac(死胡同)模式:服务向外发送领域事件而不同步等待订阅者返回,调用方不被阻塞,订阅者独立响应。

主要能力与规则:事件服务始终是基础服务,位于领域模型与事件基础设施的边界,只依赖事件代理,不依赖其他服务;每个实体只暴露两个操作:Publish[Entity]Async(异步)与 SubscribeTo[Entity]Event(同步,禁止命名为 ListenTo)。事件代理是唯一基础设施依赖,可包装任意事件库,不强制指定;每个实体在代理构造函数中拥有自己的客户端实例,代理分为基础接口、实体接口分部、基础实现、实体实现分部四个文件,操作仅为透传。验证规则:发布前校验实体非空,为空立即抛 NullEventException(断路);订阅前校验处理器委托非空,为空立即抛 NullEventHandlerException(断路)。异常规则:验证失败产生 [Entity]EventValidationException 并包装内部异常;意外异常先包装为 FailedEventServiceException,再包装为 [Entity]EventServiceException,并携带原始异常与 Data;不使用依赖类异常;用两个 TryCatch 委托隔离异常处理与业务逻辑。

使用方式:事件服务仅由编排服务消费,控制器、处理服务及其他基础服务不得直接依赖。发布方编排服务负责组合实体并调用 Publish[Entity]Async;订阅方编排服务暴露复数方法 SubscribeTo[Entity]Events,内部调用 this.[entity]EventService.SubscribeTo[Entity]Event(handler),handler 为私有异步方法。依赖注入方面:IEventBroker 与 EventBroker 的生命周期取决于事件基础设施;内存型(如 LeVent)必须使用 singleton,否则新实例无已注册处理器导致事件不送达;外部型(如 Azure Service Bus 或 EventHighway)遵循客户端库建议,通常也需 singleton。事件服务生命周期不得长于其代理。订阅不会自动激活:容器构建后,须在 Configure()(Startup.cs)或 app = builder.Build() 之后(Program.cs)调用每个订阅编排服务的 SubscribeTo[Entity]Events(),每个订阅恰好一次,缺失则静默不注册、订阅者永不收到事件。

测试:先测订阅快乐路径,再测发布快乐路径,然后测空处理器与空实体的验证失败,最后测两个操作的意外异常;测试中不得声明 loggingBrokerMock;处理器 mock 使用 Mock<Func<[Entity], ValueTask>>;每个测试以 eventBrokerMock.VerifyNoOtherCalls() 结尾;预期调用用 Times.Once,因验证失败跳过的调用用 Times.Never。

限制:本技能不含对具体事件库的强制要求,未提供安装命令、代码示例、收费或平台信息;具体实现细节以项目规范为准。