ServiceCollection 与服务注册

DI 容器

rust-webx 使用 `rust-dix` 作为 DI 容器:

Host::builder()
    .register(|svc| {
        svc.singleton::<MyService>(|_| Arc::new(MyService::new()))
           .singleton::<dyn IRequestHandler<...>>(|_| Arc::new(...))
    })
    .build()

`register()` 闭包接收 `ServiceCollection`,返回配置后的 collection。

生命周期

| 生命周期 | 方法 | 语义 | |---------|------|------| | Singleton | `svc.singleton::<T>()` | 全局唯一实例 | | Scoped | `svc.scoped::<T>()` | 每请求一个实例(预留) | | Transient | `svc.transient::<T>()` | 每次解析新建 |

WebApi 场景主要使用 **Singleton**(数据库连接池、缓存、Repository)。

注册 Handler

svc.singleton::<dyn IRequestHandler<GetUserRequest, UserDto>>(
    |resolver| {
        let repo = resolver.get_required::<UserRepository>();
        Arc::new(GetUserHandler { repo })
    }
)

注册为 `dyn IRequestHandler<T, R>` trait object 是**强制要求**。

注册中间件

svc.add_middleware::<LoggingMiddleware>()
svc.add_middleware_instance(jwt_middleware(auth))

注册后台服务

svc.add_hosted_service::<DbInitService>()

框架自动注册

`Host::build()` 自动注册:

- `#[handler]` 收集的所有 Handler - `IMediator` → `Mediator` - `add_memory_cache()` 时的 `IDistributedCache` - `add_authentication()` 时的 JWT 中间件

小结

`register()` 是组合根——所有服务组装在此完成,业务代码只消费接口。

下一节:[依赖注入模式](injection-patterns.md)