#command #query #cqrs #async #derive-debug #rust

discern

一个实现命令查询责任分离(CQRS)模式的Rust库

1个不稳定版本

0.1.0 2024年8月11日

#334异步

Download history 97/week @ 2024-08-10

97 每月下载量

MIT 许可证

56KB
258 代码行

Discern

GitHub Workflow Status License

Discern是一个实现命令查询责任分离(CQRS)模式的Rust库。它提供了一个易于使用的框架,用于在您的Rust应用程序中将写入操作(命令)与读取操作(查询)分离。

功能

  • 命令处理:轻松定义改变系统状态的命令。
  • 查询处理:定义获取数据而不修改状态的查询。
  • 处理器注册:使用方便的宏注册命令和查询处理器。
  • 异步支持:使用async_trait完全异步地处理命令和查询。

安装

discern添加到您的Cargo.toml

[dependencies]
discern = "0.1.0"

用法

以下是一个如何使用Discern创建处理CreateUserCommand的命令总线的简单示例

use discern::async_trait;
use discern::command::Command;
use discern::command::CommandBus;
use discern::command::CommandHandler;
use discern::command_bus;

#[derive(Debug)]
struct CreateUserCommand {
    username: String,
    email: String,
}

#[derive(Debug)]
enum CreateUserError {
    UsernameAlreadyExists,
    EmailAlreadyExists,
}

#[derive(Debug)]
struct CreateUserMetadata(u32);

impl Command for CreateUserCommand {
    type Metadata = CreateUserMetadata;
    type Error = CreateUserError;
}

struct CreateUserCommandHandler {
    // Add your dependencies here
}

#[async_trait]
impl CommandHandler<CreateUserCommand> for CreateUserCommandHandler {
    async fn handle(&self, command: CreateUserCommand) -> Result<CreateUserMetadata, CreateUserError> {
        // Add your command handling logic here, e.g.:
        // let user = User::new(command.username, command.email);
        // let id = self.repository.persist(user);
        let id = 42;

        Ok(CreateUserMetadata(id))
    }
}

#[tokio::main]
async fn main() {
    let command_bus: CommandBus = command_bus! {
        CreateUserCommand => CreateUserCommandHandler {
            // Add your dependencies here
        },
    };

    let command = CreateUserCommand {
        username: "alice".to_string(),
        email: "[email protected]".to_string(),
    };

    match command_bus.dispatch(command).await {
        Ok(metadata) => {
            println!("User created with ID: {}", metadata.0);
        }
        Err(error) => {
            eprintln!("Failed to create user: {:?}", err);
        }
    }
}

文档

许可证

根据您的选择,受以下许可证之一许可

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在本工作中的任何贡献,都将如上双许可,没有任何额外的条款或条件。

依赖项

~245–690KB
~16K SLoC