




资源介绍
视频数量:51个
总时长:3小时4分
课程介绍:
领域驱动设计落地实战
订单提交之后,系统为什么突然多出一张没有业务含义的数据表?金额明明由订单规则计算,保存时却被外部代码改掉;实体对象可以随意修改内部状态,昨天还能正常工作的流程,今天就可能违反业务规则。这类问题往往不是数据库设计造成的,而是业务规则没有真正留在它应该出现的地方。
这门课程围绕 EF Core 10 展开,讲解如何把领域驱动设计落实到真实代码中。课程共51个视频,总时长3小时4分,从贫血模型的痛点出发,逐步完成领域模型、映射配置、限界上下文、聚合仓储、领域事件和规格模式。内容不是停留在概念层面,而是直接讨论构造函数、私有字段、DbContext、依赖注入、事务和测试容器应该怎样配合,帮助你建立一套能运行、能测试、也能继续扩展的架构。
一、从贫血模型走向清晰的领域模型:
课程先介绍领域驱动设计的基本思路,以及 EF Core 在项目中的职责。随后分析贫血模型带来的问题:实体只有属性,没有行为,业务规则散落在控制器、服务或映射代码里,看似代码很多,真正表达业务含义的部分却很少。
接下来会梳理限界上下文、实体、值对象、聚合、仓储和领域事件之间的关系,并通过现有解决方案说明各层如何分工。代码文件的组织方式也会一并讲解,让你知道领域模型、应用服务、基础设施和数据库配置分别应该放在哪里。这样做不是单纯调整文件夹,而是让依赖方向更加清楚,让业务代码不必依赖邮件、日志、数据库或某个外部接口。
二、用映射保护业务规则:
公开的 setter 看起来方便,却能让任何代码绕过业务规则直接修改订单状态。这一部分会从这个问题切入,讲解 EF Core 如何映射到私有后备字段,以及私有 setter 和私有字段分别在什么情况下使用。
值对象会通过 owned entity 的方式实现,只读集合可以避免外部任意增删内部元素,影子标量属性则能隐藏不应暴露在公共模型中的外键。课程还会演示 IEntityTypeConfiguration 中的流式配置,让映射规则集中、清晰,便于维护。
更关键的是,EF Core 实例化实体时究竟会调用哪个构造函数,如何直接写入字段,以及构造函数、工厂方法和守卫条件怎样配合。订单聚合案例会把这些内容串起来:订单必须通过合法路径创建,金额和状态不能被随意改写,聚合边界也有明确规则。
三、用限界上下文控制模型边界:
一个庞大的 DbContext 很容易成为所有业务代码的公共杂物箱。课程会展示这种单体式上下文带来的问题,再用限界上下文为数据模型划定边界。同一张表可以在不同上下文中映射为不同模型,例如订单上下文中的订单拥有明细、状态和领域事件,运输上下文里的订单则可以只是用于查询的只读模型。
聚焦型 DbContext 的设计方法、跨上下文读取方式,以及同一数据库中配置多个上下文的过程都会详细讲解。投影、反规范化和查询性能之间的取舍也会被摆到桌面上,而不是简单宣称某一种方案永远正确。多上下文环境下的迁移策略同样重要,因为上下文拆分之后,数据库版本管理不能继续依赖混乱的自动推断。
四、为聚合根建立仓储:
仓储不是数据访问层的万能外壳,它应该围绕聚合根展开。课程会明确哪些对象需要仓储,哪些对象不需要,并将接口放在领域层,让领域模型不必反向依赖 EF Core。
实现部分会讲清加载完整聚合时 Include 的使用策略,以及新增、删除和 SaveAsync 的保存过程。SaveChanges 在这里承担工作单元和事务边界的角色,哪些修改应该一起成功、一起失败,都需要与聚合规则保持一致。
测试部分会使用 TestContainers 启动真实数据库环境,避免仓储测试只依赖内存数据库而遗漏 SQL 行为。最终还会把仓储涉及的多个文件和一个完整聚合放在一起检视,帮助你建立清晰、少依赖、方便测试的数据访问边界。
五、让领域事件进入保存事务:
订单已提交、订单已发货或订单已取消,这些事实由聚合内部产生。邮件、日志和运输系统只是对这些事实作出响应,不应该塞进订单方法里。
这一部分会讲解如何在聚合根上收集和管理事件,如何拦截 SaveChanges 分发事件,以及实现简单事件分发器。保存前分发与保存后分发的差别也会结合事务行为进行分析。OrderPlacedEvent 的完整流程展示了领域层、基础设施层和处理器之间的协作方式,既能触发后续动作,又不会让领域对象直接依赖具体基础设施。
六、用规格模式封装查询:
订单查询条件越来越多时,Include、OrderBy 和各种筛选逻辑很容易堆成一长串。规格模式可以把业务查询表达为可组合、可测试的对象。
课程先解释规格模式的核心概念,再比较使用现成库与自行实现基础类的差异。随后讲解如何为规格加入关联加载和排序,如何在仓储中应用规格,以及运行时组合多个条件。最后通过动态订单搜索案例串联完整流程,并演示如何独立测试每条规格。
适合已经会使用 C# 和 EF Core,并希望改善大型项目结构的开发者。如果你的代码库里实体对象缺少行为、DbContext 过于庞大、仓储职责混乱,或者业务规则经常被意外修改,这门课程能提供清晰的改造路径。完成课程后,你不仅能理解领域驱动设计的术语,更重要的是知道构造函数该放在哪里、哪些状态该隐藏、上下文如何划分、事件何时分发,以及每种模式应该在什么场景下承担什么职责。