1 Star 3 Fork 0

maple / sgr core

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
Clean-Architecture.md 5.33 KB
一键复制 编辑 原始数据 按行查看 历史
maple 提交于 2024-03-26 21:27 . 继续修改markdown中img路径

基于.NET 的 DDD 整洁架构脚手架

前言

本人早期接触领域驱动设计(Domain-Driven Design)是有一些抵触的,可能是长期固有的以数据驱动的三层架构思想作祟,认为引入DDD会使得应用系统架构变得复杂化。但是,经过深入研究发现DDD的设计方法在面对复杂的业务需求时会有其独特的优势。

当经典的三层架构在遇到复杂的业务需求时,不可避免的会造成其业务逻辑层的臃肿和难以维护(后期),DDD正好可以很好的解决这一问题。应用DDD的设计思想,我们可以先和领域专家一起提炼出稳定的软件内核(领域模型),再围绕内核向外进行封装提供用户所需的服务,对内提供内核运行所需的诸如持久化、网络通信等各种基础设施服务,最终形成一个完整的软件功能。

另外,DDD作为一种软件设计方法,通过领域模型的划分与构建,可很好的做到模型间的高内聚、低耦合,增强系统的可扩展性和稳定性,这些都与微服务架构的特性不谋而合,可为微服务架构的落地提供了很好的解决方案。所以,我们也可以看到,随着微服务的流行DDD也越来越多的被应用与实战项目中。因此,我就想花一点空闲时间,基于我个人对于DDD的理解与思考搭建一个基于.NET 的项目脚手架,供大家来一起参考、讨论。

最后,DDD和以数据驱动的分层架构并非谁好谁坏的区别,而是各自有其适用的场景,比如我始终认为如果仅针对某个表单的CURD来说,以数据驱动的分层架构仍是更优解。

DDD分层之整洁架构

Clean Architecture

如上图所示,我们将应用整洁架构的理念来进行DDD应用程序分层,其核心思想就是应用程序中各层之间的依赖关系都向内流动,越往里,依赖越低,代码级别越高。外层代码依赖只能指向内层,内层不知道外层的任何事情。

DDD整洁架构分层项目模板

前面我们说了整洁架构的主要原则 --> 依赖原则 ,但是在实际项目中如何落地,这里我试着基于.NET 8搭建了示例项目 Sgr.Modules.UPMS,最终结构如下图所示:

Clean Architecture

图左侧包括核心层和组件层两部分,属于应用程序基础框架,业务无关,为DDD应用落地提供基础的支撑。

  1. 核心层:定义DDD应用落地所需的基础类型,包括一系列基类、通用接口和常用帮助类。例如:

    • 定义实体、值对象基类
    • 定义仓储接口
    • 定义工作单元接口
    • 定义缓存接口
    • 定义后台任务接口
    • 定义EventBus接口
    • 定义文件对象读写接口
  2. 组件层:包括多个具有诸如Events、BackgroundsTasks、ORM等某一特定功能的类库。

    • Sgr.Mvc.Core 实现AspNetCore常用Filter及Middleware、模块化、授权、异常处理等功能
    • Sgr.MediatR 基于MediatR库实现领域事件
    • Sgr.IntegrationEvents 实现EventBus相关功能。 [待开发,计划支持内存和RabbitMQ做消息代理,采用本地消息表的方式实现最终一致解决分布式事务问题]
    • Sgr.BackGroundTasks.Quartz 基于Quartz实现后台任务管理功能。
    • Sgr.Data.EntityFrameworkCore 基于EF Core实现核心层中仓储和工作单元相关接口。
    • Sgr.Oss 实现文件对象读写,已支持本地文件读写。 [待扩展,支持阿里云Oss、腾讯云Oss、MinIO等多种存储方式]
    • Sgr.Redis 基于Redis实现数据缓存功能。
    • Sgr.Logging.NLog 基于NLog扩展日志功能。
    • Sgr.Emai 基于MailKit实现电子邮件功能。

另外,图右侧内容才是我们本次讨论的重点,我们将DDD程序分为领域模型层、应用服务层、基础设施层和用户界面层共四层。

  1. 领域模型层:它仅依赖程序框架中的核心层(用以继承核心层中定义的相关基类或接口),它是核心业务逻辑的集中地,具体包括:

    • 实体
    • 聚合根
    • 值对象
    • 领域服务
    • 领域事件
    • 仓储
    • 各种外部依赖接口
  2. 应用服务层:它仅依赖领域模型层,它作为中间层是领域模型层和外层之间的“粘合剂”,它不包含业务领域知识,它仅负责通过对领域模型对象的编排来实现整个系统的所有用例。我们采用CQRS的方式来构建应用服务层,具体包括:

    • Commands
    • CommandHandles
    • Validations
    • Queries
  3. 基础设施层:它依赖赖程序框架中的相关组件以及DDD中的领域模型层和应用服务层,它负责实现领域模型层和应用服务层中定义的接口,它聚集了各种底层资源相关的服务和能力为业务提供所需的技术支撑能,比如:

    • 定义领域对象模型与数据库模型之间映射关系
    • 实现领域模型层中的仓储接口以提供数据持久化能力
    • 实现复杂数据查询
    • 实现各种外部依赖接口(与外部API接口通信)
  4. 用户界面层:它依赖领域模型层和应用服务层,它面向前端用户提供服务和数据适配,具体功能包括:

    • 可根据实际需求选择Web GUI、Web API或gRPC的形式对外提供服务
    • DTO与VO之间的数据转换
    • 执行身份认证和权限验证
    • 执行日志审计
    • 执行限流和熔断
C#
1
https://gitee.com/maplehub/sgr-core.git
git@gitee.com:maplehub/sgr-core.git
maplehub
sgr-core
sgr core
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891