CQRS 与解耦消息传递 - 第三部分





5.00/5 (3投票s)
本系列文章的第三篇,展示了 CQRS 架构的实际应用,重点在于将消息传递作为基础设施组件进行解耦。
引言
在本文中,我们将研究库存管理器应用程序,该应用程序遵循 CQRS 架构,并使用在上一篇文章中构建的解耦消息传递基础设施组件。 库存管理器的用例基于 Greg Young 的“超级简单的 cqrs”示例。 在库存管理器中,仅实现了创建库存项目的第一个用例。
请注意,这篇文章是系列文章的一部分,以下提供了该系列中所有文章的链接
- 引言
- 企业服务总线框架的需求以及带有示例的解耦消息传递
- 库存管理器 - CQRS 应用程序(使用解耦消息传递)- 命令(本文)
- 库存管理器 - CQRS 应用程序(带有解耦消息传递)- 聚合和事件溯源
- 库存管理器 - CQRS 应用程序(带解耦的消息传递) - 读取端
库存管理器
此应用程序的代码位于 GitHub 存储库中 - 位于此处。
使用的技术栈如下
- Azure Web 和 Worker 角色
- MassTransit(版本 2.9.9)与 Azure 服务总线
- Azure 存储 – 用于存储事件的表
- 库存管理器还使用在之前的文章中解释的
IServicebus
抽象。
用户体验
- 仅实现了创建库存的第一个用例
- 因此我们有 2 个屏幕,一个显示库存项目列表,另一个允许添加库存。
- 当用户单击“添加新库存”时,他将被重定向到以下屏幕,在该屏幕中会要求输入库存的名称。
- 一旦用户点击“添加”按钮,就会触发命令消息,然后他被重定向到列表屏幕。
- 然后,该命令由 Worker 进程处理,这可能需要一些时间,之后用户才能看到更新的列表。 因此,在列表屏幕上提供了一个“刷新”按钮。
- 这遵循了 PRG 模式。
运行应用程序
- 在以下配置文件中指定 Azure 命名空间和 Azure 服务总线密钥的值
InventoryManager.Web
项目中的Web.configInventoryManager.Worker
项目中的App.config
<appSettings> <add key="azure-namespace" value="" /> <add key="azure-key" value="" /> </appSettings>
- 此外,读取模型被持久化到数据库中。 应用程序在读取端使用带有 SQL Server 的
EntityFramework
的代码优先方法。 因此,数据库将在 SQL Server 中自行创建。 需要一个名为“.\SQLExpress
”的 SQL Server 命名实例,以及一个具有dbcreator
角色的 SQL 用户“InventoryManagerReadDbUser
”。 如果需要,可以更改连接字符串以满足他们的需求。 它以名称“InventoryManagerDbContext
”存在于 Web 和 Worker 项目中。
Web 角色
项目依赖项
职责
- Web 角色与
IServicebus
接口一起工作,并在用户操作时从 Web 控制器触发命令。public class HomeController : Controller { private readonly IServiceBus _bus; // .. Code public HomeController() { _bus = IoC.Resolve<IServiceBus>(); //.. Code } // .. Code [HttpPost] public ActionResult Add(string name) { _bus.Send(new CreateInventoryItem(Guid.NewGuid(), name)); return RedirectToAction("Index"); } }
- 控制器和 Web 角色也在读取端,因此它通过简单的数据访问层访问读取模型以获取数据并在网页中显示它。
Worker 角色
项目依赖项
职责
我们将在下一篇文章中研究其中一些的实现。 Worker 角色还使用 IServicebus
接口来订阅命令、发布和订阅事件。
- 处理命令
- 在域、聚合上调用行为
- 持久化
EventSourced
聚合,即EventStore
中的事件 - 在保存聚合时发布事件,确保保存和发布以原子方式发生
- 为发布的事件提供处理程序并在处理程序中更新读取模型
系列中的下一篇文章
本系列的下一篇文章将重点介绍库存管理器应用程序中的聚合和事件溯源。
有关本系列文章的完整列表,请转到本文的“介绍”部分。
感谢阅读本文,希望它们能提供深刻的见解。