IMediator 请求调度

接口

#[async_trait]
pub trait IMediator: Send + Sync {
    async fn send<T, R>(&self, req: T) -> Result<R>
    where
        T: IRequest<R> + Send + 'static,
        R: serde::Serialize + Send + 'static;

    async fn publish<T: IEventRequest>(&self, event: T) -> Result<()>;
}

使用方式

// 在 Handler 中注入 Mediator
pub struct CreateOrderHandler {
    mediator: Arc<Mediator>,
}

async fn handle(&self, req: CreateOrderRequest) -> Result<OrderDto> {
    let order = self.create_order(&req).await?;

    // 调度另一个请求
    let user = self.mediator.send(GetUserRequest { id: order.user_id.clone() }).await?;

    Ok(order.into())
}

注意事项

`IMediator` 不是 dyn-compatible(泛型方法),使用具体类型:

// ✅
let mediator: Arc<Mediator> = ...;

// ❌ 不能作为 dyn IMediator 存储
let mediator: Arc<dyn IMediator> = ...;

与直接调用 Handler 的区别

| 方式 | 场景 | |------|------| | `mediator.send()` | 跨模块调用、需要 PipelineBehavior 拦截 | | 直接调用 Service | 同模块内复用逻辑 | | 直接调用 Handler | 仅测试时使用 |

小结

`IMediator::send()` 是模块间请求调度的标准方式,等价于 MediatR 的 `Send()`。

下一节:[IPipelineBehavior 拦截链](pipeline-behaviors.md)