在.NetCore中 DDD中基于mediatr实现领域事件并结合EFCore进行二次封装
[源代码地址https://github.com/junkai-li/NetCoreKevin]
基于NET6搭建跨平台WebApi架构支持单点登录、多缓存、自动任务、分布式、多租户、日志、授权和鉴权 、网关 注册与发现、CAP集成事件、领域事件、 docker部署
**首要要理解什么是领域事件?**
领域事件是指发生在特定领域中的事件,是你希望在同一个领域中其他部分知道并产生后续动作的事件
领域事件是领域专家所关心的(需要跟踪的、希望被通知的、会引起其他模型对象改变状态的)发生在领域中的一些事情
## 为什么需要领域事件?
领域事件的作用是捕获领域中发生的具有业务价值的一些事情,保证聚合间的数据一致性,替换批量处理,实现事件源模式,进行限界上下文集成等1。领域事件是一个领域模型中极其重要的部分,用来表示领域中发生的事件。一个领域事件必须对业务有价值,有助于形成完整的业务闭环,也即一个领域事件将导致进一步的业务操作。 领域事件可以是业务流程的一个步骤,例如订单提交,客户付费100元,订单完工后续业务
## **什么情况下使用领域事件**
1.在同一微服务中使用领域事件
不同微服务中使用集成事件本架构也有实现参考CAP
在微服务架构中,集成事件和领域事件都是用于保持领域状态同步的方式。集成事件用于跨多个微服务或外部系统保持域状态同步,而领域事件为聚合间提供了最终一致性。集成事件的目的是将已提交事务和更新传播到其他子系统,无论它们是其他微服务、绑定上下文,还是外部应用程序。因此,它们应仅在成功保存实体时发生,否则便会如同整个操作从未发生一样。而领域事件可以将大的批量操作简化为许多小的业务操作,完成强大的事件存储,完成限界上下文间的集成,是更复杂架构(cqrs)的一种支持12。
在保证集成事件和领域事件的最终一致性方面,可以使用消息队列等异步通信方式。如果系统使用受集成事件驱动的最终一致性,建议让最终用户清楚这种方法。系统不应使用模拟集成事件的方法,例如 SignalR 或客户端轮询系统。最终用户和业务所有者必须显式接受系统中的最终一致性,并意识到在许多情况下,只要显式使用该方法,业务就可以得到很好的支持3.
**
## 集成事件和领域事件的区别
集成事件 (Integration Event)用于使领域状态在多个微服务或外部系统中保持同步,将已提交事务和更新传播到其他子系统,无论它们是其他微服务、绑定上下文,还是外部应用程序。而领域事件 (DomainEvent)是推送到领域事件调度程序的消息,可基于IoC容器或任何其他方法作为内存中转存进程实现 (如 Mediator),用于驱动业务流转,尽量采用基于事件的最终一致,降低微服务之间直接访问的压力,实现微服务之间的解耦,维护领域模型的独立性和数据一致性
**
**
## 基于mediatr实现领域事件并结合EFCore进行二次封装
**
参考架构代码

基于mediatr二次封装类库

服务注入

继承领域事件继承类

注册事件 处理事件

添加事件

处理

EFcore dbContext Publish 事件

测试
[源代码地址https://github.com/junkai-li/NetCoreKevin](https://github.com/junkai-li/NetCoreKevin)
在.NetCore中 DDD中基于mediatr实现领域事件并结合EFCore进行二次封装的更多相关文章
- cobbler配置要基于PXE 环境,cobbler是pxe环境的二次封装
一:安装cobbler.httpd yum install -y cobbler httpd 二:启动cobbler.httpd systemctl start cobblerd.service sy ...
- 如何一步一步用DDD设计一个电商网站(十三)—— 领域事件扩展
阅读目录 前言 回顾 本地的一致性 领域事件发布出现异常 订阅者处理出现异常 结语 一.前言 上篇中我们初步运用了领域事件,其中还有一些问题我们没有解决,所以实现是不健壮的,下面先来回顾一下. 二.回 ...
- DDD理论学习系列(9)-- 领域事件
DDD理论学习系列--案例及目录 1. 引言 A domain event is a full-fledged part of the domain model, a representation o ...
- DDD~领域事件应用篇(订单处理变得更清晰)
回到目录 上一讲主要说了领域事件和领域总线,这并不是一个很容易理解的文章,所以本讲实例篇主要是为了补充上一讲的理论知识,本讲实例关注的是实际中的订单处理模块,我们知道,订单处理是电子商务的核心,往往在 ...
- DDD中的Unitwork与DomainEvent如何相容?(续)
上篇中说到了面临的问题(传送门:DDD设计中的Unitwork与DomainEvent如何相容?),和当时实现的一个解决方案.在实际使用了几天后,有了新的思路,和@trunks 兄提出的观点类似.下面 ...
- DDD中的聚合和UML中的聚合以及组合的关系
UML:聚合关系:成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在.如汽车(Car)与引擎(Engine).轮胎(Wheel).车灯(Light)之间的关系为聚合关系,引擎.轮胎.车灯可以 ...
- DDD中限界上下文与通用语言的作用
什么是通用语言 通用语言, 最主要的目的就是减少交流中信息丢失, 在实际开发中, 可能关联很多人, 例如有业务层面的业务细节制定者.领域专家.产品经理.项目经理 .架构师.开发经理.测试经理等等, 即 ...
- DDD中实体与值对象是干什么的
实体值对象的含义 我们前面已经讲过领域的概念, 今天来讲讲实体, 实体是我们进行设计领域模型时的基础单元, 与之有关的是值对象, 接下来先梳理一下实体以及值对象的含义,然后讲讲他们俩的关系, 希望通过 ...
- Swagger/OpenAPI By Swashbuckle在NetCore 3.1中较NetCore 2.2使用的注意事项及入门
方案选择 使用Web API时,了解其各种方法对开发人员来说可能是一项挑战. Swagger也称为OpenAPI(Open Application Programming Interface,开放应用 ...
- 区分DDD中的Domain, Subdomain, Bounded Context, Problem/Solution Space
区分DDD中的Domain, Subdomain, Bounded Context, Problem/Solution Space 译自: Domain, Subdomain, Bounded Con ...
随机推荐
- CentOS 7.* 安装最新版nginx1.28*
一.下载nginx https://nginx.org/en/download.html 选择稳定版本 nginx-1.28.0 如果使用虚拟机,可以先用windows系统下载后,上传到虚机,此步骤省 ...
- HarmonyOS运动语音开发:如何让运动开始时的语音播报更温暖
鸿蒙核心技术##运动开发##Core Speech Kit(基础语音服务)# 前言 在运动类应用中,语音播报功能不仅可以提升用户体验,还能让运动过程更加生动有趣.想象一下,当你准备开始运动时,一个温暖 ...
- .NET 10 支持Linux 的Shebang(Hashbang)
.NET 10 Preview 5 带来的C# 文件脚本化运行,在 Linux/Unix 系统中通过 #!/usr/bin/dotnet run 支持 Shebang(Hashbang) 的详细说明: ...
- SAP 发布简易REST 一:login验证
说明:这里没有使用ODATA,只是用最基础的HTTP和JSON来处理. 这篇为第一篇,所以这里来说说验证的一些东西. 创建SE24实施类,做http接口:ZCRM_REST 激活后,添加接口类:IF_ ...
- gitlab跨版本升级
此文档只讲述基于Omnibus 包安装的GitLab 修复示例: 本文采用升级gitlab版本来修复漏洞.因为gitlab官方会定期发行新版本用于修复漏洞 此升级为跨版本升级(14.10.x-ee - ...
- Golang基础笔记三之数组和切片
本文首发于公众号:Hunter后端 原文链接:Golang基础笔记三之数组和切片 这一篇笔记介绍 Golang 里的数组和切片,以下是本篇笔记目录: 数组定义和初始化 数组属性和相关操作 切片的创建 ...
- wc记录
WC记录 咋可 随机化 CF1746F 给每个值随机成\(0/1\),然后查询区间内的所有数的和是否\(\equiv0\mod k\) 考虑错误率,对于一个不合法的权值,设其有\(r\)个,考虑区间内 ...
- 分布式事务-2PC
目录 1. 2PC是什么 2. 2PC流程 3. 2PC的使用场景 4. 2PC的问题 5. 2PC的实现 5.1. XA 5.2. Seata的XA模式 6. 参考 1. 2PC是什么 保证强一致性 ...
- vite+vue3/react使用tailwindcss
vite+vue3/react使用 1.通过 npm 安装 Tailwind npm install -D tailwindcss postcss autoprefixer 2.创建您的配置文件 np ...
- react开发组件并发包到npm
Toast组件 import ReactDomCli from 'react-dom/client'; import './style.css' import React from 'react'; ...