#provider #container #cqrs #query #ioc #command #context

kti_cqrs_provider_rs

基于 ioc 容器的 CQRS 提供者

3 个版本 (破坏性更新)

0.2.0 2024 年 3 月 17 日
0.1.0 2024 年 3 月 3 日
0.0.1 2023 年 11 月 5 日

#15 in #cqrs

Download history 136/week @ 2024-03-11 125/week @ 2024-03-18 10/week @ 2024-03-25 63/week @ 2024-04-01 8/week @ 2024-04-08

每月 234 次下载

MIT/Apache

7KB
127

基于 ioc 容器的 CQRS 提供者

通过提供者包装 kti_cqrs_rs 以支持更复杂的用法

简单示例(存在于仓库中)

pub struct UserController {
  context: Arc<ContainerContext>,
}

impl UserController {
  pub fn new(context: Arc<ContainerContext>) -> Self {
    Self { context }
  }

  pub fn token() -> &'static str {
    "USER_CONTROLLER"
  }

  pub async fn get_user_by_name(&self, name: &str) -> Result<Option<User>, Box<dyn Error>> {
    let bus = self.get_cqrs_bus().await;

    let query = GetUserByNameQuery::new(name);

    bus.query(Box::new(query)).await
  }

  pub async fn create_user(&self, name: &str, email: &str) -> Result<(), Box<dyn Error>> {
    let bus = self.get_cqrs_bus().await;

    let command = CreateUserCommand::new(name, email);

    bus.command(Box::new(command)).await;

    Ok(())
  }

  pub async fn update_user(&self, name: &str, email: &str) -> Result<(), Box<dyn Error>> {
    let bus = self.get_cqrs_bus().await;

    let command = UpdateUserCommand::new(name, email);

    bus.command(Box::new(command)).await;

    Ok(())
  }

  async fn get_cqrs_bus(&self) -> cqrs_provider::Provider {
    self
      .context
      .resolve_provider::<cqrs_provider::Provider>(cqrs_provider::Provider::token())
      .await
  }
}

依赖关系

~2.7–9.5MB
~75K SLoC