当前位置: 首页 > backend >正文

(一)毛子整洁架构(Domain Layer/Repository Pattern/Result Pattern/Error Pattern)


文章目录

  • 项目地址
  • 一、整洁架构概念
    • 1.1 各个分层的功能
      • 1. Domain核心部件
      • 2. Application Layer
      • 3. Infrastructure layer
      • 3. Presenetation layer
    • 1.2 项目数据库
  • 二、Domain Layer
    • 2.1 Apartments 实体
      • 1. Current Value Obj
      • 2. Money Value Obj
      • 3. Apartment 类
    • 2.2 User 实体
      • 1. User类
    • 2.3 添加领域事件
      • 1. 添加领域事件接口
      • 2. 修改Entity基类
      • 3. 给User添加用户注册的事件
  • 三、Repository Pattern
    • 3.1 添加IRepository
    • 3.2 IUnitOfWork
  • 四、Error Pattern
    • 4.1 创建Error类
    • 4.1 实例化Error类
  • 五、Resualt Pattern


项目地址

  • 教程作者:
  • 教程地址:
  • 代码仓库地址:
  • 所用到的框架和插件:
dbt 
airflow

一、整洁架构概念

1.1 各个分层的功能

1. Domain核心部件

名称解释举例
Entities实体,具有唯一标识和生命周期的业务对象Order, User, Product
Value Objects值对象,无唯一标识,仅由值组成Email, Money, Address
Domain Events领域事件,表示领域内发生的某件重要事情OrderPlaced, UserRegistered
Domain Services不属于某个实体,但包含重要业务逻辑的服务PaymentService, CurrencyConverter
Interfaces接口,定义领域层依赖的外部功能(例如存储、邮件)IOrderRepository, INotificationService
Exceptions业务异常,用于明确抛出领域问题InsufficientBalanceException, InvalidEmailException
Enums枚举类型,定义有限状态或类型集OrderStatus, UserRole

2. Application Layer

内容解释
Orchestrates the Domain协调领域层 —— 应用层调用实体、值对象、领域服务等,把业务用例组织起来。
Contains business logic包含应用级别的业务逻辑 —— 不是业务规则本身,而是业务流程的组合,如"下订单 → 发送确认邮件"。
Defines the Use Cases定义用例 —— 每个用例通常表示用户或系统行为,如“创建事件”、“取消订单”、“生成报告”等。
Application services应用服务类 —— 是执行用例逻辑的容器,依赖领域模型(Entities、ValueObjects),协调外部接口(如仓储)。
CQRS with MediatR使用 CQRS + MediatR 模式来分离命令(Command)与查询(Query),提升结构清晰度、可测试性。

3. Infrastructure layer

  • 所有的外部系统:
    1. Databases
    2. Messaging
    3. Email providers
    4. file upload/download
    5. Storage services
    6. Identity
    7. System lock

3. Presenetation layer

  • 定义程序的入口
  • Rest Api
  • Middleware
  • DI setup

1.2 项目数据库

在这里插入图片描述

二、Domain Layer

2.1 Apartments 实体

1. Current Value Obj

  • 货币Value Obj
public record Currency
{internal static readonly Currency None = new("");public static readonly Currency Usd = new("USD");public static readonly Currency Eur = new("EUR");//私有构造函数,只能在类内部创建实例private Currency(string code){Code = code;}//只能在初始化时赋值public string Code { get; init; }//工厂方法:根据传入的字符串创建货币实例public static Currency FromCode(string code){return All.FirstOrDefault(c => c.Code == code) ??throw new ApplicationException("The currency code is invalid");}//All 集合列出了所有合法的货币public static readonly IReadOnlyCollection<Currency> All = new[]{Usd,Eur};
}

2. Money Value Obj

  • 主要内容:
    1. 运算符重载,对money的类型进行了判断,不能随便相加
    2. 对 0, 空,的Money进行了定义
public record Money(decimal Amount, Currency Currency)
{//运算符重载,必须相同的Currency才能相加public static Money operator +(Money first, Money second){if (first.Currency != second.Currency){throw new InvalidOperationException("Currencies have to be equal");}return new Money(first.Amount + second.Amount, first.Currency);}
http://www.xdnf.cn/news/4315.html

相关文章:

  • Python基于Django的在线考试系统【附源码、文档说明】
  • WiFi那些事儿(六)
  • JavaSE核心知识点01基础语法01-03(流程控制:顺序、分支、循环)
  • C语言的重要知识点☞static关键字
  • C语言_可变参数_LOG宏
  • 2.Redis高阶实战
  • git常用命令
  • RN学习笔记 ✅
  • 如何判断内核模块是否为最新版本?
  • tinyrenderer笔记(上)
  • 【Linux我做主】深入探讨从冯诺依曼体系到进程
  • v-modal失效如何解决
  • 深入浅出iOS性能优化:打造极致用户体验的实战指南
  • 仓颉语言深度解析
  • 如何建设网站?网站建设简单步骤有哪些?
  • 认识不同格式的点云数据 -OFF格式数据转点云
  • 程序员学商务英语之Shipment Claim 运输和索赔
  • C#问题 加载格式不正确解决方法
  • Python生活手册-Numpy多维数组构建:从快递分拣到智能家居的数据变形术
  • 【AI微信小程序开发】火锅计时小程序项目代码:自动涮煮计时(含完整前端代码)
  • cesium之自定义地图与地图叠加
  • python刷题笔记:三目运算符的写法
  • vue3+vite+AI大模型实现谷歌插件-web诊断
  • 高频PCB设计如何选择PCB层数?
  • 视觉爬虫开发:通过Puppeteer截图+CV定位动态元素坐标
  • 线上部署的项目Redis突然宕机了怎么办
  • 解决 Exception in thread “main“ java.lang.NoClassDefFoundError
  • CPU:为什么Ryzen 7000系列处理器PCIe通道总数是28,而可用的通道数是24?
  • 【coze】工作流(B站视频总结改写)
  • 推荐两本集成电路制作书籍