#cqrs #pattern #context #adapter #command #query #bus

kti_cqrs_rs

CQRS 模式在 Rust 中的实现

3 个版本 (破坏性更新)

0.2.0 2024 年 3 月 16 日
0.1.0 2024 年 3 月 3 日
0.0.1 2023 年 11 月 4 日

#16 in #cqrs


kti_cqrs_provider_rs 中使用

MIT/Apache

5KB
62

CQRS 模式在 Rust 中的实现

目前该包仅包含查询 & 命令处理器

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

#[cfg(test)]
mod tests {
  use std::sync::Arc;

  use kti_cqrs_rs::core::bus::{command_bus::CommandBus, query_bus::QueryBus};
  use tokio::sync::Mutex;

  use super::{
    adapters::{
      mutex_repository_adapter::MutexRepositoryAdapter, mutex_service_adapter::MutexServiceAdapter,
    },
    contexts::mutex_context::MutexContext,
    ports::mutex_service_port::MutexServicePort,
  };

  fn create_service() -> Box<dyn MutexServicePort> {
    let store = Arc::new(Mutex::new(vec![]));

    let query_repository = Box::new(MutexRepositoryAdapter::new(store.clone()));
    let command_repository = Box::new(MutexRepositoryAdapter::new(store));

    Box::new(MutexServiceAdapter::new(
      Arc::new(Mutex::new(MutexContext::new(
        query_repository,
        command_repository,
      ))),
      CommandBus,
      QueryBus,
    ))
  }

  #[tokio::test]
  async fn should_be_empty_vector() {
    let service = create_service();

    let count = service.get_count().await.unwrap();

    assert_eq!(count, 0);
  }

  #[tokio::test]
  async fn should_be_one_element() {
    let service = create_service();

    service.add_element(1).await.unwrap();

    let count = service.get_count().await.unwrap();

    assert_eq!(count, 1);
  }

  #[tokio::test]
  async fn should_be_empty_after_remove() {
    let service = create_service();

    service.add_element(1).await.unwrap();
    service.remove_element(1).await.unwrap();

    let count = service.get_count().await.unwrap();

    assert_eq!(count, 0);
  }

  #[tokio::test]
  async fn should_be_error_on_remove_not_existed_element() {
    let service = create_service();

    let res = service.remove_element(1).await;

    assert!(res.is_err());
  }
}

依赖项

~2.7–9.5MB
~76K SLoC