abp vnext2.0核心组件之领域实体组件源码解析
接着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,配合EF Core,开发效率直线提升.如果抽象用的好.
纯属个人理解,能力有限,有问题请指正!
abp vnext2.0核心组件之领域实体组件源码解析的更多相关文章
- abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源码解析
老版Abp对Castle的严重依赖在vnext中已经得到了解决,vnext中DI容器可以任意更换,为了实现这个功能,底层架构相较于老版abp,可以说是进行了高度重构.当然这得益于.Net Core的D ...
- DRF-解析器组件源码解析
解析器组件源码解析 解析器组件源码解析 1 执行request.data 开始找重装的request中的data方法 2 在dispatch找到重装的request def dispatch(self ...
- abp vnext2.0之核心组件模块加载系统源码解析与简单应用
abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...
- 04、NetCore2.0下Web应用之Startup源码解析
04.NetCore2.0Web应用之Startup源码解析 通过分析Asp.Net Core 2.0的Startup部分源码,来理解插件框架的运行机制,以及掌握Startup注册的最优姿势. - ...
- Abp领域事件(EventBus)源码解析
Abp中使用EventBus来解耦领域中的业务逻辑,也是订阅-发布模式的一种实现.简单来说就是,当我触发一个事件,注册了这个事件的处理器就会被找到并执行. 先看看整体代码结构 其中Entities文件 ...
- DRF之认证组件源码解析
认证组件 认证的几种方法:cookie,session,token几种.但是session会使服务器的压力增大,所以我们经常使用的是token.获取唯一的随机字符串: 登陆携带token值的处理: ...
- .NET开发邮件发送功能的全面教程(含邮件组件源码)
今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1) 邮件基础理论知识 2) ...
- Flume-ng源码解析之Channel组件
如果还没看过Flume-ng源码解析之启动流程,可以点击Flume-ng源码解析之启动流程 查看 1 接口介绍 组件的分析顺序是按照上一篇中启动顺序来分析的,首先是Channel,然后是Sink,最后 ...
- EventBus3.0源码解析
本文主要介绍EventBus3.0的源码 EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递. EventBus使用简单,并将事件发布和订阅充 ...
随机推荐
- $CF949D\ Curfew$ 二分/贪心
正解:二分/贪心 解题报告: 传送门$QwQ$ 首先这里是二分还是蛮显然的?考虑二分那个最大值,然后先保证一个老师是合法的再看另一个老师那里是否合法就成$QwQ$. 发现不太会搞这个合不合法的所以咕了 ...
- $vjudge-$基本算法专题题解
考完期末又双叒回来刷普及题辣$kk$ 然后放个链接趴还是$QwQ$ [X]$A$ 因为是嘤文($bushi$所以放个题意趴$QwQ$ 就汉诺塔问题,只是说有四个塔$A,B,C,D$,要求输出有1-12 ...
- 使用Django进行后端开发
目录 更换pip源 搭建虚拟环境 项目目录设置 项目相关配置 更换pip源 更换pip源 搭建虚拟环境 搭建虚拟开发环境 项目目录设置 项目目录设置 项目相关配置 项目相关配置
- 从0开发3D引擎(二):准备预备知识
大家好,本文介绍了开发3D引擎需要的预备知识,给出了相关的资源. 上一篇博文 从0开发3D引擎(一):开篇 了解Web 3D Web 3D的历史 目前Web 3D是基于WebGL这个Web端3D AP ...
- 洛谷P1082 同余方程 题解
题目链接:https://www.luogu.com.cn/problem/P1082 题目大意: 求关于 \(x\) 的同余方程 ax≡1(mod b) 的最小正整数解. 告诉你 \(a,b\) 求 ...
- 洛谷P1832 A+B Problem(再升级) 题解 完全背包方案计数
题目链接:https://www.luogu.com.cn/problem/P1832 题目大意: 给定一个正整数n,求将其分解成若干个素数之和的方案总数. 解题思路: 首先找到所有 \(\le n\ ...
- 突破CRUD | 简单优雅的代码生成工具诞生记(万字长文慎入)
0.学习本文你或许可以收获 1.一个需求从产生.分析到解决的全过程思考2.简单的面向对象分析实践3.UML类图实践4.设计模式的实践应用5.最后收获一款还算不错的代码生成工具实现思路和源代码 本文将从 ...
- 解决apt-get命令出现的安装源错误
首先linux环境下打开网页,输入上网账号密码,确保已经联网 直接安装软件或库的时候,在管理员模式下,在终端输入:apt-get install A可以自动安装A 有时会出现下面的安装源错误 这是因为 ...
- 灵魂画师,在线科普多云平台/CMP云管平台/中间件/虚拟化/容器是个啥
原创: 灵魂工作室 速石科技 经常碰到有人问: 你们是云管吗? 你们和CMP多云管理平台有什么区别? 你们这个多云平台到底是个啥? emmmmm,问题还挺不好回答. 为了说清楚这些问题,但又不希望你们 ...
- python检查是奇数还是偶数
检查的依据:奇数除2余1:偶数除2无余数 num = int(input("请输入一个整数:")) if num % 2 == 1: print(num,"是奇数&quo ...