解耦消息架构与CQRS应用:库存管理器

在本文中,将探讨如何构建一个基于解耦消息架构的CQRS(命令查询职责分离)应用,即库存管理器。这个应用将展示如何使用消息队列来解耦组件,提高系统的可扩展性和可维护性。将从创建库存项的第一个用例开始实现。

技术栈

本应用使用了以下技术栈:

  • Azure Web和Worker角色
  • MassTransit(版本2.9.9)与Azure服务总线
  • Azure Storage - 用于存储事件的表格
  • EntityFramework - 用于读取模型的Code-first方法与SQL Server

用户界面体验

目前,只实现了创建库存项的第一个用例。因此,有两个界面:一个显示库存项列表,另一个允许添加库存。当用户点击“添加新库存”时,他将被重定向到一个新界面,要求输入库存的名称。一旦用户点击“添加”按钮,就会触发命令消息,然后用户被重定向到列表界面。命令随后由工作进程处理,可能需要一些时间,之后用户可以看到更新后的列表。因此,在列表界面上提供了一个“刷新”按钮。这是遵循PRG(Post/Redirect/Get)模式的。

运行应用

在以下配置文件中指定Azure命名空间和Azure服务总线密钥的值:

  • InventoryManager.Web项目的Web.config
  • InventoryManager.Worker项目的App.config
<appSettings> <add key="azure-namespace" value="" /> <add key="azure-key" value="" /> </appSettings>

读取模型持久化在数据库中。应用程序使用Code-first方法与SQL Server的EntityFramework。因此,数据库将自动在SQL Server中创建。需要一个名为“.\SQLExpress”的SQL Server实例,以及一个名为“InventoryManagerReadDbUser”的SQL用户,该用户具有dbcreator角色。如果需要,可以更改连接字符串以适应需求。它在Web和Worker项目中以“InventoryManagerDbContext”的名称存在。

Web角色

Web角色与IServiceBus接口一起工作,根据用户操作从Web控制器触发命令。

public class HomeController : Controller { private readonly IServiceBus _bus; public HomeController() { _bus = IoC.Resolve<IServiceBus>(); } [HttpPost] public ActionResult Add(string name) { _bus.Send(new CreateInventoryItem(Guid.NewGuid(), name)); return RedirectToAction("Index"); } }

控制器和Web角色也在读取侧,因此它通过简单的数据访问层访问读取模型,以获取数据并在网页上显示。

Worker角色

Worker角色也使用IServiceBus接口来订阅命令,发布和订阅事件。在下一篇文章中,将查看其中一些的实现。Worker角色还负责处理命令、调用领域行为、聚合、持久化事件源聚合(即事件存储中的事件)、在聚合保存时发布事件,确保保存和发布以原子方式发生,以及为发布的事件提供处理程序并在处理程序中更新读取模型。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485