65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2016年3月4日

CPOL

2分钟阅读

viewsIcon

19396

本系列文章的第五篇,也是最后一篇,展示了 CQRS 架构的实际应用,重点在于将消息传递作为基础设施组件进行解耦。

引言

在本文中,我们将关注库存管理器应用程序的读取端。库存管理器的用例基于 Greg Young 的“超级简单 cqrs”示例。在库存管理器中,仅实现了创建库存项的第一个用例。

库存管理器应用程序的代码位于 GitHub 存储库中 - 位于此处

请注意,这篇文章是系列文章的一部分,该系列文章的所有链接如下所示。

  1. 引言
  2. 企业服务总线框架的需求以及带有示例的解耦消息传递
  3. 库存管理器 - CQRS 应用程序(带有解耦消息传递)- 命令
  4. 库存管理器 - CQRS 应用程序(带有解耦消息传递)- 聚合和事件溯源
  5. 库存管理器 - 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。
  • 欢迎对本文提出任何反馈,感谢您的耐心。
  • 有关本系列文章的完整列表,请转到本文的“介绍”部分。

参考文献

  1. Greg Young 的“超级简单 cqrs”示例
© . All rights reserved.