1 个不稳定版本
0.1.0 | 2021 年 9 月 11 日 |
---|
#42 in #event-handling
用于 chekov
24KB
612 行代码(不包括注释)
Chekov
一个用于在 Rust 中构建应用程序的
CQRS/ES
框架目录
特性
Postgres
事件存储后端- 将
Command
分发到Aggregate
或CommandHandler
- 从
Aggregate
生成Event
并持久化它们 - 将
Event
应用到Aggregate
- 使用订阅存储和通知
Event
- 将
Event
分发到EventHandler
入门
选择事件存储后端
Chekov 目前只与 Postgres
后端兼容(以及 InMemory
用于测试目的)。选择很简单!
但需要实现更多后端,请参阅相关问题。
定义聚合
聚合是一个包含领域状态的 struct。以下是一个用户聚合的示例
#[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,
}
定义 Sagas
尚未实现
常见问题解答
Chekov
是否已准备好投入生产?
不,它还没有。项目的某些关键部分尚未实现,在投入生产之前,还需要对大量代码进行重构。
需要帮助?
如有错误或功能请求,请随时提交问题。如果您的问题不是错误或功能请求,讨论 也是一个很好的起点。
贡献
项目处于早期阶段,有许多待办任务。其中一项主要任务是制定路线图或可用于展示项目愿景的一些问题。如果您想讨论这个话题,请随意在讨论区发帖!
依赖项
约2MB
约42K SLoC