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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (8投票s)

2016 年 3 月 2 日

CPOL

3分钟阅读

viewsIcon

43395

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

引言

DDD 和 CQRS 有很陡峭的学习曲线。 有许多文章和代码示例以简化的方式解释了 CQRS 架构的基础知识。 但是,当将 CQRS 应用于实际应用程序时(例如:使用 Azure Servicebus、RabbitMQ 或 MSMQ 等企业服务总线),许多实现将这些消息传递问题与核心域耦合在一起。 这使得将 CQRS 应用于实际应用程序变得困难。

本系列文章展示了“如何”实现具有解耦基础设施关注点的架构,以便最终解决方案易于遵循和维护。

必备组件

  1. DDD 知识
  2. 对 CQRS 架构的基本理解
  3. Azure Web 和 Worker Roles
  4. Azure 服务总线

背景

DDD 强调需要保持领域模型免受基础设施和应用程序层关注的影响。 如下图所示

如上所示,依赖关系指向域层内部。 没有层依赖于基础设施的具体实现。 Main 可以用于引导依赖关系,这些依赖关系将被表示层调用。

在 DDD 中,跨聚合的通信是通过消息传递完成的。 在 CQRS 中,消息传递是发送命令和发布事件所必需的。 因此,消息传递成为实现这种架构时的关键基础设施组件。

但是,消息传递仍然是一个基础设施组件,因此应该从域中抽象出来。 我们将为此创建一个接口 IServicebus,并了解像 Masstransit、nServicebus(具有不同的传输,如 msmq、Azure 服务总线)等不同的 Servicebus 框架如何用作基础设施层中相同的具体实现。

public interface IServiceBus : IDisposable
{
    void Publish(IEvent eventMessage);
    void Send(ICommand commandMessage);
}

因此,所有层(除了基础设施)都将使用 IServiceBus 接口,并且不会在基础设施消息传递组件中直接依赖于具体实现的代码。 这使得用其他实现轻松交换第三方库,并且在实现业务逻辑时也不会妨碍我们。

本系列将涵盖哪些内容?

这是本系列文章的简要介绍。

  1. 引言
    • 当前文章解释了所遵循的原则。
  2. 企业服务总线框架的需求以及带有示例的解耦消息传递
    • 我们将查看 MassTransitnServicebus 文档中的示例,并将发布订阅从这些示例中解耦。
  3. 库存管理器 - CQRS 应用程序(带有解耦的消息传递)- 命令
    • 将介绍库存管理器应用程序。 它是 Greg Young 的 Simple CQRS Example 的实现,但使其可用于实际应用。 目前,库存管理器应用程序仅实现创建库存项的第一个用例。
    • 这篇文章将重点介绍在库存管理器 应用程序中遵循 CQRS 架构发送命令。
  4. 库存管理器 - CQRS 应用程序(带有解耦的消息传递)- 聚合和事件溯源
    • 解释库存管理器应用程序中聚合和事件溯源的工作原理
    • 重点关注如何在保存聚合时确保发布事件(没有分布式事务)
  5. 库存管理器 - CQRS 应用程序(带有解耦的消息传递)- ReadSide
    • 库存管理器中的薄读取层以及实现它时需要注意的点
© . All rights reserved.