102 个版本 (53 个稳定版)
1.1.37 | 2024年5月30日 |
---|---|
1.1.32 | 2024年4月30日 |
1.1.19 | 2024年3月29日 |
0.2.45 | 2024年1月18日 |
0.2.28 | 2023年11月25日 |
#2 in #cqrs
每月 1,131 次下载
49KB
1K SLoC
event-store-adapter-rs
此库旨在将 DynamoDB 转换为支持 CQRS/事件存储的事件存储库。
使用方法
您可以使用 EventStore 轻松实现支持事件存储的存储库。
pub struct UserAccountRepository {
event_store: EventStore<UserAccount, UserAccountEvent>,
}
impl UserAccountRepository {
pub async fn store_event(&mut self, event: &UserAccountEvent, version: usize) -> Result<(), RepositoryError> {
let result = self.event_store.persist_event(event, version).await;
match result {
Ok(_) => Ok(()),
Err(err) => Err(Self::handle_event_store_write_error(err)),
}
}
pub async fn store_event_and_snapshot(
&mut self,
event: &UserAccountEvent,
snapshot: &UserAccount,
) -> Result<(), RepositoryError> {
let result = self.event_store.persist_event_and_snapshot(event, snapshot).await;
match result {
Ok(_) => Ok(()),
Err(err) => Err(Self::handle_event_store_write_error(err)),
}
}
pub async fn find_by_id(&self, id: &UserAccountId) -> Result<Option<UserAccount>, RepositoryError> {
let snapshot_result = self.event_store.get_latest_snapshot_by_id(id).await;
match snapshot_result {
Ok(snapshot_opt) => match snapshot_opt {
Some(snapshot) => {
let events = self
.event_store
.get_events_by_id_since_seq_nr(id, snapshot.seq_nr() + 1)
.await;
match events {
Ok(events) => Ok(Some(UserAccount::replay(events, snapshot))),
Err(err) => Err(Self::handle_event_store_read_error(err)),
}
}
None => Ok(None),
},
Err(err) => Err(Self::handle_event_store_read_error(err)),
}
}
}
以下是一个存储库使用的示例。
let event_store = EventStore::new(
aws_dynamodb_client.clone(),
journal_table_name.to_string(),
journal_aid_index_name.to_string(),
snapshot_table_name.to_string(),
snapshot_aid_index_name.to_string(),
64,
);
let mut repository = UserAccountRepository::new(event_store);
// Replay the aggregate from the event store
let mut user_account = repository.find_by_id(user_account_id).await.unwrap();
// Execute a command on the aggregate
let user_account_event = user_account.rename(name).unwrap();
// Store the new event without a snapshot
repository
.store_event(&user_account_event, user_account.version())
.await
// Store the new event with a snapshot
// repository
// .store_event_and_snapshot(&user_account_event, &user_account)
// .await
表格规范
CQRS/事件存储示例
许可证。
MIT 许可证。详细信息请见 LICENSE。
链接
依赖项
~22MB
~385K SLoC