DDD聚合在 ASP.NET Core中的实现

news/2025/7/8 20:02:30/

目录

工作单元(UnitOfWork)的实现

聚合与聚合根的实现

实现

聚合与DbContext的关系

区分聚合根实体和其他实体

跨表查询

实现实体不要面向数据库建模


工作单元(UnitOfWork)的实现

  1. EFCore的DbContext:跟踪对象状态的改变;SaveChanges把所有的改变一次性地提交到数据库中,是一个事务。因此DbContext是天然的UnitOfWork实现。
  2. 需要把DbContext再封装一次UoW吗?两种观点。
    观点一:可以以后有切换其他ORM的可能,所以把DBContext封装起来。
    观点二:不需要封装,直接用DBContext就行。

聚合与聚合根的实现

  1. 即使一个实体类型没有声明对应的DbSet类型的属性,只要EF Core遇到实体对象,EF Core仍然会像对待其他实体对象一样处理。
  2. 因此我们可以在上下文中只为聚合根实体声明DbSet类型的属性。对非聚合根实体、值对象的操作都通过根实体进行。
  3. 跨聚合只能引用根实体的Id,而不是根实体对象。

实现

  1. 聚合根实体中定义对聚合内的所有实体进行操作的方法。
  2. 只在DBContext中为聚合根定义DbSet属性。

聚合与DbContext的关系

如果一个微服务中有多个聚合根,那么是每个聚合根的实体放到一个单独的上下文中,还是把所有实体放到同一个上下文中?各自的优缺点是什么?

  1. 单独上下文:每个聚合有自己的DBContext,隔离性更好
  2. 同一个上下文:它们之间的关系仍然比它们和其他微服务中的实体关系更紧密,而且我们还会在应用服务中进行跨聚合的组合操作。进行联合查询的时候可以获得更好的性能,也能更容易实现强一致性的事务。 

区分聚合根实体和其他实体

定义一个不包含任何成员的标识接口,比如IAggregateRoot,然后要求所有的聚合根实体类都实现这个接口。

跨表查询

  1. 所有跨聚合的数据查询都应该是通过领域服务的协作来完成的,而不应该是直接在数据库表之间进行join查询。会有性能损失,需要做权衡,不是死规矩。
  2. 对于统计、汇总等报表类的应用,则不需要遵循聚合的约束,可以通过执行原生SQL等方式进行跨表的查询。
  3. 跨聚合进行实体引用,只能引用根实体,并且只能引用根实体的Id,而不是根实体对象。
  4. 每个微服务管理自己的数据库,有可能两个微服务用的是两个数据库。

实现实体不要面向数据库建模

建模的时候不要先考虑实体在数据库中如何保存。比如实体类和数据表具有直接的对应关系,实体类中属性和数据表中的列几乎完全一致。这样设计出来的类称不上“实体类”,只能被成为数据对象(Data Object)。更不要用DB First(反向工程)。

应该不考虑数据库实现的情况下进行领域模型建模,然后再使用Fluent API等对实体类和数据库之间做适配。在实现的时候,可能需要对建模进行妥协性修改,但是这不应该在最开始被考虑。


http://www.ppmy.cn/news/1572016.html

相关文章

【漫话机器学习系列】091.置信区间(Confidence Intervals)

置信区间(Confidence Intervals)详解 1. 引言 在统计学和数据分析中,我们通常希望通过样本数据来估计总体参数。然而,由于抽样的随机性,我们不可能得到精确的总体参数,而只能通过估计值(如均值…

Spring Cloud — 深入了解Eureka、Ribbon及Feign

Eureka 负责服务注册与发现;Ribbon负责负载均衡;Feign简化了Web服务客户端调用方式。这三个组件可以协同工作,共同构建稳定、高效的微服务架构。 1 Eureka 分布式系统的CAP定理: 一致性(Consistency)&am…

第39周:猫狗识别 2(Tensorflow实战第九周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 5.1 上次程序的主要Bug 5.2 修改版…

系统思考—团队学习

“一个人的成长是从问题中学习,而组织的成长是从结构中进化。” —— 彼得圣吉 看似松散的团队学习结构,回头一看,你早已成长了许多。今天和小伙伴们聊起2024年,才发现很多改变,都是在不经意间发生的。 从最初的探索…

Linux权限提升-内核溢出

一:Web到Linux-内核溢出Dcow 复现环境:https://www.vulnhub.com/entry/lampiao-1,249/ 1.信息收集:探测⽬标ip及开发端⼝ 2.Web漏洞利⽤: 查找drupal相关漏洞 search drupal # 进⾏漏洞利⽤ use exploit/unix/webapp/drupal_dr…

在 python 中使用 toml

从 Python 3.11 开始,标准库引入了一个名为 tomllib 的模块,但请注意,这仅是用于解析 TOML 文件的功能,并且最初只包含了读取(解析)TOML 数据的能力,而不包括生成 TOML 数据的功能,使…

同为科技智能PDU助力Deepseek人工智能和数据交互的快速发展

1 2025开年,人工智能领域迎来了一场前所未有的变革。Deepseek成为代表“东方力量”的开年王炸,不仅在国内掀起了技术热潮,并且在全球范围内引起了高度关注。Deepseek以颠覆性技术突破和现象级应用场景席卷全球,这不仅重塑了产业格…

Win11从零开始配置Ubuntu虚拟机(2025.2)

系统:Win11 目标系统:Linux:ubuntu-24.04.1-desktop-amd64.iso 平台:VMware:VMware-workstation-full-17.6.2-24409262.exe 目标主要是配置环境并上载到远程不可联网的服务器。。。。 1.安装VMware 主要参考&…