Skip to content

分层架构

Dddify 遵循基于整洁架构设计思想的分层设计方案,将代码划分为四个主要层:领域层应用层基础设施层展示层。各层之间职责分离,依赖关系清晰,有助于项目模块化、低耦合以及提高代码的可维护性和可测试性。

代码分层

各层的主要职责和依赖关系如下:

领域层

  • 主要职责

    • 业务建模:定义领域模型,包括聚合根、实体、值对象等,完整表达业务概念。
    • 业务规则:实现领域服务与业务规则,确保领域对象始终处于一致有效状态。
    • 保持纯净:领域层作为系统核心,不依赖于其他层,只专注于业务规则和领域概念。
  • 依赖关系

    • 无对外依赖:领域层不依赖于应用层、基础设施层或展示层,仅供其他层调用。
    • 引用基础库:需要引用 Dddify 等支持性 NuGet 包。

应用层

  • 主要职责

    • 用例编排:定义并协调系统的各个用例(命令与查询),负责调用领域层的模型与服务来完成业务流程。
    • 事务管理:处理事务边界、工作单元模式等,确保业务操作的一致性。
    • 接口定义:声明服务接口,供基础设施层提供具体实现。
  • 依赖关系

    • 依赖领域层:应用层依赖领域层来执行业务逻辑,但不直接涉及技术实现细节。
    • 对外隔离:展示层只需调用应用层暴露的接口,无需了解内部业务规则。

基础设施层

  • 主要职责

    • 技术实现:实现持久化(如 EF Core 上下文)、外部服务、缓存、消息总线等技术细节。
    • 接口实现:对领域层定义的仓储接口和应用层定义的服务接口进行具体实现。
    • 辅助支持:负责与操作系统、网络、数据库等低层平台打交道。
  • 依赖关系

    • 依赖领域层和应用层:通过实现领域层和应用层定义的接口来提供技术支持,通过依赖注入与上层解耦。
    • 内向依赖:确保所有外部依赖均通过应用层或领域层的抽象接口来隔离。

展示层

  • 主要职责

    • 用户交互:负责处理用户请求、展示结果,如 Web API、MVC 控制器、前端 UI 等。
    • 调用服务:将用户请求转化为应用层用例调用,获取业务结果后展示。
    • 界面逻辑:处理界面相关的展示逻辑,但不包含业务规则的实现。
  • 依赖关系

    • 主要依赖应用层:通过调用应用层服务(中介者发送命令或查询)来执行业务逻辑,保持与领域层和基础设施层的隔离。
    • 依赖基础设施层:展示层在启动配置中可能引用基础设施层(如注册 EF Core 上下文),但仅用于配置目的,不直接调用业务逻辑。

解决方案目录

以下是一个基于上述设计原则的 推荐解决方案目录 结构,同时包含对应的测试和文档目录。

├── MyCompany.MyProject.sln                     # 解决方案文件
├── docs/
│   ├── README.md                               # 项目简介及说明
│   │   ...
├── src/
│   ├── MyCompany.MyProject.Domain/             # 领域层
│   │   ├── Entities/                           # 实体
│   │   ├── ValueObjects/                       # 值对象
│   │   ├── Aggregates/                         # 聚合根
│   │   ├── Services/                           # 领域服务
│   │   ├── Events/                             # 领域事件
│   │   └── Repositories/                       # 仓储接口
│   │   ...
│   ├── MyCompany.MyProject.Application/        # 应用层
│   │   ├── Commands/                           # 命令、命令处理器、命令验证器
│   │   ├── Queries/                            # 查询、查询处理器
│   │   ├── Services/                           # 服务接口
│   │   ├── Behaviors/                          # 自定义 MediatR 管道行为
│   │   ├── Mappings/                           # 对象映射配置
│   │   ├── Dtos/                               # 数据传输对象
│   │   └── EventHandlers/                      # 领域事件处理器
│   │   ...
│   ├── MyCompany.MyProject.Infrastructure/     # 基础设施层
│   │   ├── Data/                               # EF Core 上下文、实体配置、数据迁移
│   │   ├── Repositories/                       # 仓储实现
│   │   ├── Services/                           # 服务实现
│   │   ...
│   └── MyCompany.MyProject.Presentation/       # 展示层
│       ├── Controllers/                        # WebAPI、MVC 控制器
│       ├── Models/                             # 请求参数模型
│       └── Middlewares/                        # 自定义中间件
│       └── Filters/                            # 自定义过滤器
│       └── Pages/                              # Razor 视图
│       └── Resources/                          # 本地化资源
│       ...
├── tests/
│   ├── MyCompany.MyProject.Domain.Tests/       # 领域层测试
│   ├── MyCompany.MyProject.Application.Tests/  # 应用层测试
│   └── MyCompany.MyProject.Integration.Tests/  # 集成测试

引用关系

MyCompany.MyProject.Application --> MyCompany.MyProject.Domain
MyCompany.MyProject.Infrastructure --> MyCompany.MyProject.Application
MyCompany.MyProject.Infrastructure --> MyCompany.MyProject.Domain
MyCompany.MyProject.Presentation --> MyCompany.MyProject.Application
MyCompany.MyProject.Presentation --> MyCompany.MyProject.Infrastructure

命名约定

  • MyCompany:表示公司的名称或组织名称。
  • MyProject:表示项目的名称或应用程序的名称。

INFO

Dddify 定位“轻量级”框架,旨在保持其核心功能的简洁性,因此选择不提供项目创建模板,开发者需参考自行创建或调整解决方案目录。

基于 MIT 许可发布