#事件溯源 #CQRS #聚合 #领域驱动设计 #模式 #架构

eventmill

为 Rust 应用程序提供事件溯源和 CQRS

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 模式

MIT/Apache

62KB
1.5K SLoC

eventmill  

Latest Release Documentation License Rustc Support 1.39+ Build Status

为 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