事件发布与订阅

定义事件

#[derive(Clone)]
pub struct UserCreatedEvent {
    pub user_id: String,
    pub email: String,
}

impl IEventRequest for UserCreatedEvent {}

定义事件处理器

pub struct SendWelcomeEmailHandler;

#[async_trait]
impl IEventHandler<UserCreatedEvent> for SendWelcomeEmailHandler {
    async fn handle(&self, event: UserCreatedEvent) -> Result<()> {
        tracing::info!("Sending welcome email to {}", event.email);
        Ok(())
    }
}

发布事件

async fn handle(&self, req: CreateUserRequest) -> Result<UserDto> {
    let user = self.repo.create(&req).await?;

    self.mediator.publish(UserCreatedEvent {
        user_id: user.id.clone(),
        email: user.email.clone(),
    }).await?;

    Ok(user)
}

多处理器

同一事件可有多个 `IEventHandler<T>` 实现,`publish()` 广播到所有已注册的处理器。

与直接调用的选择

| 场景 | 推荐 | |------|------| | 创建用户后发邮件、写日志、更新缓存 | `publish()` 事件 | | 需要返回值 | `mediator.send()` 请求 | | 同步强依赖 | 直接调用 Service |

小结

事件系统实现模块间松耦合通信,发布方不感知有多少订阅者。

下一章:[认证与授权](../09-auth-security/INDEX.md)