CQRS 与解耦消息传递 第五部分





5.00/5 (1投票)
本系列文章的第五篇,也是最后一篇,展示了 CQRS 架构的实际应用,重点在于将消息传递作为基础设施组件进行解耦。
引言
在本文中,我们将关注库存管理器应用程序的读取端。库存管理器的用例基于 Greg Young 的“超级简单 cqrs”示例。在库存管理器中,仅实现了创建库存项的第一个用例。
库存管理器应用程序的代码位于 GitHub 存储库中 - 位于此处
请注意,这篇文章是系列文章的一部分,该系列文章的所有链接如下所示。
- 引言
- 企业服务总线框架的需求以及带有示例的解耦消息传递
- 库存管理器 - CQRS 应用程序(带有解耦消息传递)- 命令
- 库存管理器 - CQRS 应用程序(带有解耦消息传递)- 聚合和事件溯源
- 库存管理器 - CQRS 应用程序(带有解耦消息传递)- ReadSide(本文)
ViewModel 生成器
- 正如我们在上一篇文章中看到的那样,在 worker role 中,viewmodel 生成器处理事件
InventoryCreated
。 - 处理程序与
ReadModel
一起工作,创建一个新的库存并将其保存在Read
端的数据库中。 Readside
上的数据库是 Code-first EF SQL 数据库。
读取端
- 网站从读取数据库读取数据,使用精简的数据访问层并在 MVC 视图中显示它。
在 IOC 中使用 Func<>
- 一个值得关注的有趣的事情是如何在 Read 端的精简数据层中使用
Func<>
。 HomeController
调用InventoryItemsDao
来检索所有库存项的列表。public class HomeController : Controller { private readonly IServiceBus _bus; private readonly InventoryItemsDao _inventoryItemsDao; public HomeController() { _bus = IoC.Resolve<IServiceBus>(); _inventoryItemsDao = IoC.Resolve<InventoryItemsDao>(); } public ActionResult Index() { var inventoryItems = _inventoryItemsDao.GetAllInventoryItems(); return View(inventoryItems); } // .. Code }
- 没有为
InventoryItemsDao
使用IoC
进行注册。因此,IoC
将尝试创建该类的一个实例,并尝试解析它可能在其构造函数中提供的任何依赖项。 InventoryItemsDao
具有如下构造函数public class InventoryItemsDao { private readonly Func<InventoryManagerDbContext> _contextFactory; public InventoryItemsDao(Func<InventoryManagerDbContext> contextFactory) { _contextFactory = contextFactory; } public IList<InventoryItem> GetAllInventoryItems() { using (var context = _contextFactory.Invoke()) { return context .Query<InventoryItem>() .ToList(); } } }
InventoryManagerDbContext
有一个默认构造函数,因此它不必向IoC
容器注册。IoC
允许我们在Func
返回参数中指定依赖项,并在调用Func
上的invoke
时解析该依赖项。点击这里获取更多信息。
结论
- 这涵盖了库存管理器应用程序的代码演练。我希望你觉得这篇文章有趣。
- 该代码仍然是一个概念验证,我将在使用它时发布解决方案的更新。但是,它肯定可以作为一个很好的试验场,用于在实际应用中尝试 CQRS。
- 欢迎对本文提出任何反馈,感谢您的耐心。
- 有关本系列文章的完整列表,请转到本文的“介绍”部分。
参考文献
- Greg Young 的“超级简单 cqrs”示例