1 个不稳定版本
0.1.0 | 2022年1月30日 |
---|
#21 in #backends
21KB
515 行代码(不包括注释)
Chekov
A
CQRS/ES
框架,用于使用 Rust 构建 应用程序目录
特性
Postgres
EventStore 后端- 将
Command
分发到Aggregate
或CommandHandler
- 从
Aggregate
生成Event
并持久化它们 - 将
Event
应用到Aggregate
- 使用订阅存储和通知
Event
- 将
Event
分发到EventHandler
入门指南
选择 EventStore 后端
Chekov 目前仅支持 Postgres
后端(以及 InMemory
用于测试目的)。选择很简单!
但还需要实现更多后端,请参阅相关问题。
定义聚合
聚合是一个包含领域状态的 struct。以下是一个 UserAggregate 的示例
#[derive(Default, Aggregate)]
#[aggregate(identity = "user")]
struct User {
user_id: Option<Uuid>,
account_id: Option<Uuid>,
}
/// Define an Executor for the `CreateUser` command
/// The result is a list of events in case of success
impl CommandExecutor<CreateUser> for User {
fn execute(cmd: CreateUser, _state: &Self) -> Result<Vec<UserCreated>, CommandExecutorError> {
Ok(vec![UserCreated {
user_id: cmd.user_id,
account_id: cmd.account_id,
}])
}
}
/// Define an Applier for the `UserCreated` event
/// Applier is a mutation action on the aggregate
#[chekov::applier]
impl EventApplier<UserCreated> for User {
fn apply(&mut self, event: &UserCreated) -> Result<(), ApplyError> {
self.user_id = Some(event.user_id);
self.account_id = Some(event.account_id);
Ok(())
}
}
定义命令
您需要为每个命令创建一个 struct,任何类型的 struct 都可以实现 Command
,但我们建议使用 struct 以提高可读性。
命令只能产生(或不产生)一种类型的事件,并且它针对单个聚合。命令必须有一个单一且唯一的 identifier
,该标识符用于将命令路由到正确的目标。
#[derive(Debug, Command)]
#[command(event = "UserCreated", aggregate = "User")]
struct CreateUser {
#[command(identifier)]
user_id: Uuid,
account_id: Uuid,
}
定义事件
Event
可以是一个 struct
或一个 enum
。
#[derive(Event, Deserialize, Serialize)]
struct UserCreated {
user_id: Uuid,
account_id: Uuid,
}
定义 Saga
尚未实现
常见问题解答
Chekov
是否已经准备用于生产?
不是。项目的某些关键部分尚未实现,并且在实现之前需要大量重构代码。
需要帮助?
如果遇到错误或功能请求,请随时在 GitHub 上创建问题。如果您的问题既不是错误也不是功能请求,讨论 也是一个很好的开始。
贡献
项目处于非常早期阶段,有许多待办任务,其中一项主要任务是制定路线图或可以用来展示项目愿景的一些问题。如果您想讨论这个问题,请随时打开讨论!
依赖项
~15–28MB
~432K SLoC