4 个版本 (重大变更)
0.4.0 | 2020 年 5 月 23 日 |
---|---|
0.3.0 | 2020 年 5 月 17 日 |
0.2.0 | 2020 年 5 月 16 日 |
0.1.0 | 2020 年 5 月 10 日 |
#1585 in Rust 模式
62KB
1.5K SLoC
eventmill
为 Rust 应用程序提供事件溯源和 CQRS
仍在积极开发中!
[dependencies]
eventmill = "0.4"
要使用 derive
宏,请激活 derive
功能
[dependencies]
eventmill = { version = "0.4", features = ["derive"] }
使用示例
定义您的领域事件
const EVENT_NAMESPACE: &str = "https://github.com/innoave/eventmill/examples/counter";
#[derive(EventType, Debug, Clone, PartialEq)]
#[event_source(EVENT_NAMESPACE)]
#[event_type_version("V1")]
#[event_type("Incremented")]
struct Incremented;
定义您的聚合
#[derive(AggregateType, Debug)]
#[id_field(id)]
#[initialize_with_defaults]
struct Counter {
id: i32,
hits: u64,
}
实现将事件应用于聚合的业务逻辑
impl Aggregate<Incremented> for Counter {
fn apply_event(&mut self, _event: &DomainEvent<Incremented, Self>) {
self.hits += 1;
}
}
定义一个命令
#[derive(Debug, PartialEq)]
struct Increment;
实现业务逻辑,使聚合能够处理该命令
impl HandleCommand<Increment, Self> for Counter {
type Event = Incremented;
type Error = Infallible;
type Context = ();
fn handle_command(
&self,
_command: Increment,
_context: &Self::Context,
) -> Result<Vec<NewEvent<Self::Event, Counter>>, Self::Error> {
Ok(vec![NewEvent {
aggregate_id: self.id,
data: Incremented,
}])
}
}
使用 Core
分发器将所有内容组合在一起
fn main() {
let event_store = InMemoryStore::new();
let core = Core::new(event_store);
let aggregate_id = 4711;
let increment_command = DomainCommand {
aggregate_id,
aggregate_generation: Generation::default(),
data: Increment,
};
let versioned_counter: VersionedAggregate<Counter> = core
.dispatch_command(increment_command, &())
.expect("counter incremented");
assert_eq!(versioned_counter.state().hits, 1);
}
这些代码示例来自 counter
示例。请查看 eventmill-examples
了解更多。
待办事项
- 定义基本抽象和 API
- 提供一个使用 API 的示例
- 制作更多示例以完善 API
- 为 API 编写 rust-doc
- 支持 async/await 或切换到异步作为唯一选项
- 考虑为事件存储和其他构建块提供默认实现
- ...
依赖关系
~1.4–2.2MB
~42K SLoC