设为首页 加入收藏

TOP

asp.net core系列 62 CQRS架构下Equinox开源项目分析(一)
2019-09-17 18:24:15 】 浏览:66
Tags:asp.net core 系列 CQRS 架构 Equinox 开源 项目 分析

一.DDD分层架构介绍

  本篇分析CQRS架构下的Equinox开源项目。该项目在github上star占有2.4k。便决定分析Equinox项目来学习下CQRS架构。再讲CQRS架构时,先简述下DDD风格,在DDD分层架构中,一般包含表现层、应用程序层(应用服务层)、领域层(领域服务层)、基础设施层。在DDD中讲到服务这个术语时,比如领域服务,应用层服务等,这个服务是指业务逻辑,而不是指任何技术如wcf,web服务。

  下图是从经典三层构架演变为DDD下的分层架构图:

 

  1.表现层

    表现层前端往后端post的数据称"输入模型(InputModel)",后端控制器传给前端要显示的数据称"视图模型(ViewModel)",大多时候视图模型与输入模型是重合的,所在在下面要介绍的开源项目中,作者在应用服务层只定义了ViewModels文件夹。例如在MVC中,控制器里只是编排任务,调用应用程序层。在控制器中代码块应该尽可能轻薄,主要作用是找出层与层之间的分离,控制器只是业务逻辑占位符

    在表现层中与运行环境密切相连,表现层需要关注的是http上下文、会话状态等。

 

  2. 应用服务层

    可以在应用服务层引用领域层和基础设施层,是在领域层之上编排业务用例的服务。该层对业务规则一无所知,不会包含任何与业务有关的状态信息。该层关键特点:

    (1) 该层是针对不同的前端。该层与表现层有关,是为表现层服务。不同的表现层(移动,webapi, web)都有自己的应用服务层。该层与表现层属于系统的前端

    (2) 应用服务层可能是有状态的,至少就UI任务进度而言。

    (3) 它从表现层获取输入模型,然后把视图模型返回去。

 

  3. 领域层

    领域层是最重要和最复杂的一层。在DDD的领域模型架构下。该层包含了所有针对一个或多个用例业务逻辑,领域层包含一个领域模型和一组可能的服务。

    领域模型大多时候是一个实体关系模型,可以由方法组成。是拥有数据和行为。如果缺少重要行为,那就是一个数据结构,称为贫血模型。领域模型是实现统一语言和表达业务流程所需的操作。

    领域层包含的服务是领域服务,是涉及多个领域模型而无法放个单个领域模型中的领域逻辑。领域服务是一个类,包含了多个领域模型实体的行为。领域服务通常也需要访问基础设施层。

    在DDD的CQRS架构下,使用二个不同的领域层,而不是一个(在Equinox项目中混合成一个)。这种分离把查询操作放在一层(查询领域层),把命令操作放在另一层(命令领域层)。在CQRS里,查询栈仅仅基于SQL查询,可以完全没有模型、应用程序层和领域层。查询领域层只需要贫血模型类DTO来做传输对象。

 

  4. 基础设施层

    这层使用具体技术有关的任何东西:O/RM工具的数据访问持久层、IOC容器的实现(Unity)、以及很多其它横切关注点的实现,如安全(Oauth2)、日志记录、跟踪、缓存等。最突出的组件是持久层。

 

二.CQRS概述

  1.简介

    CQRS是DDD开发风格下对领域模型架构的一种简化改进。任何业务系统基本都是查询与写入,对应CQRS是指命令/查询责任分离,查询不以任何方式修改系统状态,只返回数据。另一方面,命令(写入)则修改系统的的状态,但不返回数据,除了状态代码或确认信息。在CQRS里,查询栈仅基于sql查询,可以完全没有模型,应用程序层和领域层。CQRS方案还可以为命令栈和查询栈准备不同的数据库(读与写)。

 

  2.CQRS的好处

    (1)是简化设计降低复杂性,对于查询来说,可以直接读取基础设施层的仓储。

    (2)是增强可伸缩性的潜能。比如读取是主导操作,可以引入某种程序的缓存,极大减少访问数据库的次数。比如写入在高峰期减慢系统,可以考虑从经典的同步写入模型换到异步写入甚至命令队列。分离了查询和命令,可以完全隔离处理这两个部分的可伸缩性。

 

  3.CQRS实现全局图

    在全局图中,右图通过虚线表示双重分层架构,分开了命令通道和查询通道,每个通道都有独立架构。在命令通道里,任何来自表现层的请求都会变成一个命令,并加入到处理器队列。每个命令都携带信息。每个命令都是一个逻辑单元,可以充分地验证相关对象的状态,智能的决定执行哪些更新以及拒绝哪些更新。处理命令可能会产生事件(事件通常是记录命令发生的事情),这些事件会被其它注册组件处理

 

三. Equinox开源项目总览

  1.准备环境

    (1)  Github开源地址下载。Full ASP.NET Core 2.2 application with DDD, CQRS and Event Sourcing

    (2)  在sqlserver里执行sql文件GenerateDataBase.sql。

    (3)  修改appsettings.json中的ConnectionStrings的数据库连接地址。

  

  2.项目分层说明

                   表现层:Equinox.UI.Web、Equinox.Services.Api

                   应用服务层: Equinox.Application

                   领域层: Equinox.Domain、Equinox.Domain.Core

                   基础设施层: Equinox.Infra.Data(EF持久化)

                   基础设施层下的横切关注点:

                     Equinox.Infra.CrossCutting.Bus(事件和命令总线)

                     Equinox.Infra.CrossCutting.Ide

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【原创】代码性能优化之创建对象 下一篇VS 快捷键使用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目