自定义组件封装
封装中间件组件
将中间件 + 配置 + 注册封装为 Builder 扩展:
pub trait TenantBuilderExt {
fn use_multi_tenant(self, config: TenantConfig) -> Self;
}
impl TenantBuilderExt for HostBuilder {
fn use_multi_tenant(self, config: TenantConfig) -> Self {
let resolver = Arc::new(TenantResolver::new(config));
self.register(move |svc| {
svc.singleton::<TenantResolver>(move |_| Arc::clone(&resolver));
svc.add_middleware_instance(tenant_middleware(Arc::clone(&resolver)));
})
}
}
消费方:
Host::builder().use_multi_tenant(config).build()
封装服务组件
// 在你的 library crate 中
pub struct EmailModule;
impl EmailModule {
pub fn register(svc: &mut ServiceCollection, config: SmtpConfig) {
svc.singleton::<EmailService>(move |_| Arc::new(EmailService::new(config)));
}
}
// main.rs
.register(|svc| EmailModule::register(svc, smtp_config))
封装 Handler 基类模式
Rust 无继承,用组合替代:
pub struct BaseHandler {
pub cache: Arc<dyn IDistributedCache>,
pub mediator: Arc<Mediator>,
}
impl BaseHandler {
pub async fn get_cached_user(&self, id: &str) -> Result<UserDto> {
self.cache.get_or_create(&format!("user:{}", id), async {
self.mediator.send(GetUserRequest { id: id.into() }).await
}).await
}
}
pub struct GetUserProfileHandler {
base: BaseHandler,
}
发布为独立 Crate
通用组件可发布为独立 crate,只依赖 `rust-webx-core`:
[dependencies]
rust-webx-core = "0.2"
小结
好的封装让消费方一行启用,内部隐藏注册细节和配置逻辑。
下一节:[自定义 Endpoint](custom-endpoints.md)