wwwision / dcb-example
Sara Pellegrini 描述的动态一致性边界模式(Dynamic Consistency Boundary pattern)的简单示例
Requires
- php: >=8.2
- ramsey/uuid: ^4.7
- webmozart/assert: ^1.11
- wwwision/dcb-eventstore: ^1.0
- wwwision/dcb-eventstore-doctrine: ^1.0
Requires (Dev)
- behat/behat: ^3.13
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.1
- roave/security-advisories: dev-latest
- squizlabs/php_codesniffer: ^4.0.x-dev
This package is auto-updated.
Last update: 2024-08-30 01:39:47 UTC
README
简单示例,展示由 Sara Pellegrini 描述的动态一致性边界模式 (点击查看详细)。
此包的目的是探索这一想法,寻找潜在的问题,并传播相关信息。
总结 请查看 示例脚本 或 Behat 测试 以了解具体操作。
背景
动态一致性边界(Dynamic Consistency Boundary,简称 DCB)允许在事件源系统中强制实施硬约束,而无需依赖于单个事件流。这有助于关注领域模型的行为,而不是其刚性结构。它还允许更简单的架构和潜在的性能改进,因为多个投影可以在同一事件上操作,而无需同步。
在上述博客文章中详细了解这一有趣的方法,或观看 Saras 在 YouTube 上的演讲(带有英语字幕)。此包使用 wwwision/dcb-eventstore 包和 wwwision/dcb-eventstore-doctrine 数据库适配器来模拟此演示的示例(略有差异)。
重要类/概念
- 命令 是本示例包的一个概念。它们实现了 命令标记接口
- 命令处理器 是中心权威机构,处理和验证传入的命令
- ...它使用内存中的 投影 来强制实施硬约束
- 投影 非常小,因为它们专注于单一责任(例如,而不是 "CourseAggregate",有三个投影 CourseExistenceProjection.php、CourseTitleProjection 和 CourseCapacityProjection.php)
- 事件附加器 允许轻松发布使用 事件标准化器 序列化的 事件
- 此包尚未包含读取模型(即经典投影)
考虑/发现
我一直觉得,将焦点放在事件流上是领域驱动设计的干扰。因此,当我遇到这个概念时,我感到非常高兴。到目前为止,我还没有机会在现实世界场景中测试它,但它对我来说非常有意义。在我看来,这个例子表明,这种方法在实践中确实行之有效(尽管当前实现中存在一些小问题)。
使用方法
通过 composer 安装
composer create-project wwwision/dcb-example-courses
现在您应该能够通过以下方式运行 示例脚本
php dcb-example-courses/index.php
您应该会得到...完全没有输出。这是因为示例脚本目前满足所有约束。尝试更改脚本以测试业务规则是否确实得到执行,例如,您可以在文件末尾添加以下行
$commandHandler->handle(new SubscribeStudentToCourse(CourseId::fromString('c1'), StudentId::fromString('s2')));
这将导致以下异常
Failed to subscribe student with id "s2" to course with id "c1" because a student with that id does not exist
或者,您可以查看 Behat 测试
测试
此包包含16个Behat场景,涵盖所有业务功能。您可以通过以下方式运行测试
composer test-behat
致谢
这些包的大部分实现都基于Sara Pellegrini所做的大量基础工作,所以所有的赞誉都归功于她!
贡献
我非常好奇对这个项目的反馈。请自由开始/加入 讨论、问题 或 Pull requests。