1个不稳定版本
0.1.0 | 2024年8月11日 |
---|
#334 在 异步
97 每月下载量
56KB
258 代码行
Discern
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版 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在本工作中的任何贡献,都将如上双许可,没有任何额外的条款或条件。
依赖项
~245–690KB
~16K SLoC