abp vnext2.0核心组件之DDD组件之实体结构源码解析

      接着abp vnext2.0核心组件之模块加载组件源码解析和abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源码解析集合.Net Core3.1,基本环境已经完备,接下去就是构建领域层,vnext整个领域层大致分为聚合根、实体、值对象、事件实体、仓储、服务等等,内容较多,所以我打算分随笔进行介绍.首先介绍领域实体。注:这边所说的实体,是abp团队提供的抽象.如果不了解领域相关的知识,建议阅读<<领域驱动设计:软件核心复杂性应对之道>>需要一定设计模式的功底.如果设计模式不了解,请移步本人的设计模式分类.我也是略懂,所以本文有不当之处,请指正!谢谢!另外提一点,贫血的领域模型和充血的领域模型有本质的区别.有兴趣的可以研究研究,后续有时间我也会补充随笔,大家一起来探讨.

 

领域实体分为审计实体和一般实体,如下图所示

 图中红框为常用实体抽象,Events中的实体需要配和EventBus事件总线,这一块作为vnext的单独组件,后续我会写一篇文章解析源码.ok,下面开始讲解.

 

整个实体抽象结构和老版abp没有什么大的区别.单单从内容看.首先介绍普通实体.分为聚合根和一般实体

1、实体

为什么要先介绍实体,因为聚合根也是一个实体,实体代码如下:

 

 这边就很有趣了,很明显支持复合主键的实体.貌似和老版Abp不一样,记不太清了,一般情况下,复合主键的设计也比较少见.单主键较多.

再看看泛型实体,主键可自行指定

 很简单,这边说下Equals的逻辑,比较复杂,如下:

 这两个逻辑很简单,看看就明白了.

接下去判断实体的主键

 如果主键的值为其类型的默认值,且比较的两个类型都是如此,那么直接认为两个实体不相等.

到这里需要理解下这个逻辑,如果两个实体不为空,且类型一致,且引用不一样,但是两个实体的主键都为其类型的默认值.则认为两个实体不相等.

 官方解释是:Transient objects are not considered as equal

接着

 两个类型必须具有类型的IS-a关系或必须是同一类型

接着

 如果两个实体都是租户实体,且上面的条件都不满足的情况下,两个实体的租户Id不相等,则认为两个实体不相等.

ok,实体结构到这里解析完毕,比较简单.

 

2、聚合根

聚合根本身也属于一个实体,其结构如下

 挑几个核心接口解析下

 每一个聚合根都具有一组方法来操作领域事件,因为领域事件作为vnext单独组件的存在,所以本文不做解析,后续会有随笔进行介绍.

接着

每一个聚合根都维护了一个额外属性的字段,方便进行灵活的扩展.比如和mogodb等库进行合作.

接着

 每一个聚合根都维护着一个并发令牌,初始化聚合根时,直接给一个GUID值,貌似只在EF Core中有效.其他ORM可能需要自行实现(个人理解,如果Dapper支持这种机制,请在评论区告知,万分感谢)。

当然对应的有一个泛型版本,主键可自行指定

ok,整个聚合根的结构也介绍完毕,比较简单. 

 

3、审计实体 - 创建型实体

(1)、创建型实体

 只包含创建功能的常规实体抽象.泛型版本主键可自行指定 如下:

 整个设计我个人有一个疑问,如下:

 主键不应当统一吗?欢迎在评论区讨论.

 

(2)、创建型实体带创建人抽象

 如果当前记录需要记录创建人,那么就可以使用这个实体.当然也提供了泛型版本,主键可自行指定

 

4、审计实体 - 创建修改型实体

(1)、创建修改型实体

如果当前实体同时具备创建和修改的功能,那么可以使用如下实体抽象

 这里的Guid,依然如此,个人觉得主键需统一,泛型版本主键可自行指定 如下:

 

(2)、创建修改型实体呆创建者和修改者

如果当前实体同时具备创建和修改的功能,同时需要记录创建者和修改者,那么可以使用如下实体抽象

 泛型版本,主键可自行指定 如下:

 

5、审计实体 - 创建修改删除型实体

(1)、创建修改删除型实体

如果当前记录具备创建、修改、删除三大功能,那么可以使用如下实体抽象

 

 泛型版本 主键可自行指定 如下:

(2)、创建修改删除型实体带创建者和修改者和删除者

如果当前实体同时具备创建和修改和删除的功能,同时需要记录创建者和修改者和删除者,那么可以使用如下实体抽象

  泛型版本 主键可自行指定 如下:

 

 

6、审计聚合根 - 创建型聚合根

如果当前聚合根具备创建的功能,那么可以使用如下实体抽象

 泛型版本 主键自行指定如下

 因为篇幅问题,聚合根其余的功能就不介绍了,和实体一致.其实本质聚合根就是一个实体.

ok,vnext关于DDD的实体结构架构大致就是如此,很简单,当然这边领域事件结构没有介绍,后续有随笔会介绍.可以看到,除了主键没有统一.这个设计非常的nice

 

7、值对象

关于值对象有如下文章

https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/implement-value-objects

微软提供的关于值对象的实现思路,abp团队也是参照此文章实现,其代码如下:

 

 

 

 abp团队也只是提供了简单的抽象,代码也比较简单,这里就不多说明了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[蓝桥杯2017初赛]方格分割-dfs+思维

解题思路&#xff1a; 这是大佬的思路&#xff1a; 这道题可能上来会想到搜格子&#xff0c;但搜格子意味着更高的复杂度以及判连通的需要&#xff0c;本题似乎搜索要切开的边更优。由题意&#xff0c;这一条切割线必定经过图的中心点&#xff0c;那么我们一旦确定了半条到达边…

数据结构---Kruskal最小生成树

数据结构—Kruskal最小生成树 原理&#xff1a;参考趣学数据结构 代码&#xff1a; 快速排序&#xff1a; #pragma once #define elemType int typedef struct vER {elemType u;elemType v;int weight; }VER; int quickSort(VER a[], int l, int h) {//快速排序int i l, j…

电脑打字手指正确姿势_写字坐姿不正确的难题,已被家长攻克,果然高手在民间...

全文1000字&#xff0c;预计阅读需7分钟​进入小学&#xff0c;老师会教一年级学生如何坐正&#xff0c;如何正确拿笔&#xff0c;但由于学生人数较多&#xff0c;加之学习课本知识等&#xff0c;老师很难将每一个学生的坐姿都教得很好。什么样的坐姿才是正确的&#xff1f;怎样…

云原生 - Istio可观察性之监控(四)

作者&#xff1a;justmine头条号&#xff1a;大数据与云原生微信公众号&#xff1a;大数据与云原生创作不易&#xff0c;在满足创作共用版权协议的基础上可以转载&#xff0c;但请以超链接形式注明出处。为了方便阅读&#xff0c;微信公众号已按分类排版&#xff0c;后续的文章…

word List 09

word List 09 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢

phpword 模板 多页_高中数学:各题型答题模板,吃透,灵活运用数学公式,解题更快!...

暑假已经接近尾声&#xff0c;部分地区已经开学了。最近有同学留言说&#xff0c;高三了&#xff0c;数学成绩很不好&#xff0c;该怎么办&#xff1f;数学拉分很多。针对高三复习&#xff0c;大家一定要注意题型的积累&#xff0c;每个题型都是有相应的答题模板&#xff0c;积…

使用.NET Core优雅获取并展示最新疫情数据

前言新型冠状病毒的出现&#xff0c;着实让人紧张。我每天一大早都会去查看今天的最新数据&#xff0c;可是每次的数据都挺让人揪心的。今天突然间很想看看过去的历史的数据&#xff0c;结果查了很多资料都不是很全。反正国家让我们待在家里做贡献&#xff0c;那我们也可以多做…

linux源码_从linux源码看epoll及epoll实战揭秘

从linux源码看epoll前言在linux的高性能网络编程中&#xff0c;绕不开的就是epoll。和select、poll等系统调用相比,epoll在需要监视大量文件描述符并且其中只有少数活跃的时候&#xff0c;表现出无可比拟的优势。epoll能让内核记住所关注的描述符&#xff0c;并在对应的描述符事…

《ASP.NET Core 微服务实战》-- 读书笔记(第9章)

第 9 章 微服务系统的配置微服务系统中的配置需要关注更多其他方面的因素&#xff0c;包括&#xff1a;配置值的安全读写值变更的审计能力配置信息源本身的韧性和可靠性少量的环境变量难以承载大型、复杂的配置信息应用要决定是否支持配置值的在线更新和实时变更&#xff0c;还…

数据结构---简单插入排序

数据结构—简单插入排序 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> void simpleInsertSort(int a[], int length) {//简单插入排序int j;for (int i 2; i < length; i) {//从第二个元素开始比较插入if (a[i]…

[蓝桥杯2018初赛]小朋友崇拜圈

题目描述 班里N个小朋友&#xff0c;每个人都有自己最崇拜的一个小朋友&#xff08;也可以是自己&#xff09;。 在一个游戏中&#xff0c;需要小朋友坐一个圈&#xff0c; 每个小朋友都有自己最崇拜的小朋友在他的右手边。 求满足条件的圈最大多少人&#xff1f; 小朋友编号为…

前端 JS/TS 调用 ASP.NET Core gRPC-Web

前言在上两篇文章中&#xff0c;介绍了ASP.NET Core 中的 gRPC-Web 实现 和 在 Blazor WebAssembly 中使用 gRPC-Web&#xff0c;实现了 Blazor WebAssembly 调用 ASP.NET Core gRPC-Web。虽然 ASP.NET Core 中的 gRPC-Web 实现目前还是试验性项目&#xff0c;但是鉴于它在生态…

数据结构---哈夫曼树

数据结构—哈夫曼树 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #define N 100 #define INF 2^31-1 typedef struct fNode {//哈夫曼树中每个节点的信息int c;//字符int parent;//父节点&#xff0c;左右孩子&am…

热电偶校验仪_热电偶校验方法_烟台一等热电偶,干湿两用温度校验炉公司

杭州中创为您详细解读hzzc6烟台一等热电偶的相关知识与详情&#xff0c;防爆涡轮流量计的转速通过拆正在机壳外的传感线圈来检测&#xff0e;当涡轮流量计叶片切割由壳体内**磁钢发生的磁力线时&#xff0c;就会引起传感线圈中的磁通变革&#xff0e;传感线圈将检测到的磁通周期…

手把手教你用C#做疫情传播仿真

手把手教你用C#做疫情传播仿真在上篇文章中&#xff0c;我介绍了用 C#做的疫情传播仿真程序的使用和配置&#xff0c;演示了其运行效果&#xff0c;但没有着重讲其中的代码。今天我将抽丝剥茧&#xff0c;手把手分析程序的架构&#xff0c;以及妙趣横生的细节。首先来回顾一下运…

word List 10

word List 10 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

java程序员选择多个offer时需要看重哪些?_对不起,我们公司不要本科以下的大学生,学历对于程序员重不重要...

来自普通大学的学生&#xff0c;总会觉得逆袭如梦似幻&#xff0c;机会在哪里&#xff1f;但放长远来看&#xff0c;更重要的是要看到&#xff1a;环境只能影响&#xff0c;却不能决定我们的人生。人生路漫长&#xff0c;最终会怎样&#xff0c;还不一定呢&#xff01;在某综艺…

中小企业团队敏捷产品开发流程最佳实践

近期因为疫情的影响&#xff0c;不少互联网公司开始尝试远程工作。也出不了少如何做好远程工作的方法&#xff0c;我认为不管是场地办公还是远程办公都依赖于原来的产品开发流程。我曾经遵循CMMI5的流程管理过15人左右的跨国/语言/文化团队&#xff0c;也遵循敏捷Scrum管理过9人…

数据结构---二叉线索树

数据结构—二叉线索树 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> typedef struct bmTree {int data;struct bmTree* lchild, *rchild;int ltag, rtag; }bmTree; bmTree * preNULL;//中序遍历的前驱指针 void cr…

revit如何根据坐标进行画线_铭成教你如何根据同步带的齿形进行选型

1、同步带齿形分类梯型齿同步带分为&#xff1a;最轻型MXL、超轻型XXL、特轻型XL、轻型L、重型H、特重型XH、超重型XXH&#xff0c;共七种&#xff0c;这几种是目前市场用的最广泛的。特殊齿型的同步带又分为&#xff1a;最轻型T2.5、轻型T5、重型T10、最重型T20&#xff0c;现…