ABP领域层知识回顾之---实体
标题:重温ABP领域层
1. 前言
最近一段时间一直在看《ABP的开发指南》(基于DDD的经典分层架构思想)
。因为之前一段时间刚看完《领域驱动设计:软件核心复杂性应对之道》
,概念比较多,看着有点空。于是拿起了这本书。应该说是不是书, 只是一个PDF版的开发指南。于是乎,就开始了。好了,废话不多说,首先是ABP领域层的结构介绍,如下图所示:
从图中可以看到,ABP
的领域层分为 实体
,仓储
,工作单元
,数据过滤器
,以及领域事件
五个部分。这五个部分的功能作用,如果看过了解过DDD
的应该不会陌生。接下来我将一一介绍这五个部分的详情,每个部分具体作用,以及实现。顺便给自己温习温习。附加一点自己粗浅的理解,如有不正确的地方,欢迎指正,交流。
2. 各个模块
2.1 ABP领域层-实体
很多对象不是通过它们的属性定义的,而是通过一连串的连续性事件和标识定义的。———摘录自《领域驱动设计》第5章 5.2 模式:Entity(又称为Reference Object)
在ABP的实体中,实体继承至Entity。可以细分为下面三个部分。1、实体类
,2、接口约定
以及3、IEntity接口
2.1.1 首先是第一个实体类
查看源码发现如下:
namespace Abp.Domain.Entities
{
/// <summary>
/// A shortcut of <see cref="T:Abp.Domain.Entities.Entity`1" /> for most used primary key type (<see cref="T:System.Int32" />).
/// </summary>
[Serializable]
public abstract class Entity : Entity<int>, IEntity, IEntity<int>
{
}
}
然后最后我们看下IEntity<TPrimary>
之后就真相大白了。
namespace Abp.Domain.Entities
{
/// <summary>
/// Defines interface for base entity type. All entities in the system must implement this interface.
/// </summary>
/// <typeparam name="TPrimaryKey">Type of the primary key of the entity</typeparam>
public interface IEntity<TPrimaryKey>
{
/// <summary>Unique identifier for this entity.</summary>
TPrimaryKey Id { get; set; }
/// <summary>
/// Checks if this entity is transient (not persisted to database and it has not an <see cref="P:Abp.Domain.Entities.IEntity`1.Id" />).
/// </summary>
/// <returns>True, if this entity is transient</returns>
bool IsTransient();
}
}
相当于每个继承于 Entity
的都有一个Id
属性。Id
属性是该实体的主键,所以,Id是所有继承自Entity
类的实体的主键。当然,从源码中,我们可以发现。很显然这个Id数据的类型可以被更改。因为是<TPrimary>
类型的,所以,你如果想要改成long
,或者Guid
等等啦。只需要向如下这样定义:
public class ClassA : Entity<Guid>
{
//...
}
2.1.2 第二个是接口约定
刚开始听到这个名字时,我觉得有点难以理解。但是在文章中,听了一下解释。可以帮助理解,如下:
很多实体会有像
CreationTime
用来指示该实体是什么时候被创建的。ABP提供了一些有用的接口来实现类似的功能,只需要实现这些接口的实体,就能够实现指定的功能。
在接口预定
中,又分为如下三个部分:
首先是审计(Auditing)
,这个接口主要的是CreationTime
这个属性。只要实体类实现IHasCreationTime
接口,当该实体被插入到数据库时,ABP会自动设置该属性的值为当前时间。
public interface IHasCreationTime{
DateTime CreationTime{get;set;}
}
审计中还有一个接口ICreationAudited
,这个接口是扩展至IHasCreationTime
,并且该接口还有一个属性CreatorUserId
,可以用来记录当前用户的Id
,
public interface ICreationAudited : IHasCreationTime{
long ? CreatorUserId{get;set;}
}
CreationAuditedEntity
类已实现了 ICreationAudited
我们可以直接继承来使用。
审计中还有一个实现类似修改功能的接口IModificationAudited
public interface IModificationAudited{
DateTime? LastModificationTime{get;set;}
ling? LastModifierUserId{get;set;}
}
当然,如果你想都实现这些审计属性,ABP也提供给你了。IAudited
接口。
public interface IAudited : ICreationAudited, IModificationAudited{
}
可能你有点乱了,我来给你理理。大概就是如下这样的。
这样简单吧。
接下来是软删除
, 表示标记了一个实体已经被删除了。而不是从数据库中删除记录。对应的接口为ISoftDelete
:
public interface ISoftDelete{
bool IsDeleted{get;set;}
}
来源于文中:当一个实现了软删除的实体正在被删除,ABP会察觉到这个动作,并且阻止其删除,设置
IsDeleted
属性值为true
并且更新数据库中的实体。
和审计中的ICreationAudited
类似, 记录谁删除了这个实体。IDeletionAudited
接口。
public interface IDeletionAudited: ISoftDelete{
long? DeleterUserId{get;set;}
DateTime? DeletionTime{get;set;}
}
当然,如果你想要实现所有(包括,创建,修改,和删除。)那就实现这个终极接口, IFullAudited
public interface IFullAudited: IAudited , IDeletionAudited{
//...
}
实体类 FullAuditedEntity
实现了 IFullAudited
接口。可以直接继承使用。
那么审计的终极总结图就如下:
很清楚了吧!
PS:详情可以查看源代码 Abp.Domain.Entities.Auditing
2.1.3最后一个是IEntity接口
在2.1.1 中已经介绍了一下,这里就不赘述。Entity
实现了 IEntity
接口(和Entity<TPrimaryKey>
实现了 IEntity<TPrimaryKey>
接口)。
2.2 ABP领域层-仓储
2.3 ABP领域层-工作单元
2.4 ABP领域层-数据过滤器
2.5 ABP领域层-领域事件
3. 结语
本想一次性把这些都总结整理一下,突然发现内容有点多。还是一步一步来,慢慢整理把。这次先整理实体。好尴尬。
4.附录
参考链接:
- https://www.aspnetboilerplate.com/Pages/Documents
- http://www.cnblogs.com/farb/p/ABPTheory.html
- http://www.cnblogs.com/mienreal/p/4528470.html
ABP领域层知识回顾之---实体的更多相关文章
- ABP领域层知识回顾之---仓储
1. 前言 在上一篇博文中 http://www.cnblogs.com/xiyin/p/6810350.html 我们讲到了ABP领域层的实体,这篇博文继续讲ABP的领域层,这篇博文的主题是ABP ...
- ABP领域层知识回顾之---工作单元
1. 前言 在上一篇博文中(http://www.cnblogs.com/xiyin/p/6842958.html) 我们讲到了ABP领域层的仓储.这边博文我们来讲 工作单元.个人觉得比较重要.文 ...
- ABP(现代ASP.NET样板开发框架)系列之10、ABP领域层——实体
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之10.ABP领域层——实体 ABP是“ASP.NET Boilerplate Project (ASP.NET样板 ...
- ABP领域层——实体
ABP领域层——实体 基于DDD的现代ASP.NET开发框架--ABP系列之10.ABP领域层——实体 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的 ...
- ABP(现代ASP.NET样板开发框架)系列之11、ABP领域层——仓储(Repositories)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之11.ABP领域层——仓储(Repositories) ABP是“ASP.NET Boilerplate Proj ...
- ABP(现代ASP.NET样板开发框架)系列之12、ABP领域层——工作单元(Unit Of work)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之12.ABP领域层——工作单元(Unit Of work) ABP是“ASP.NET Boilerplate Pr ...
- ABP(现代ASP.NET样板开发框架)系列之13、ABP领域层——数据过滤器(Data filters)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之13.ABP领域层——数据过滤器(Data filters) ABP是“ASP.NET Boilerplate P ...
- ABP(现代ASP.NET样板开发框架)系列之14、ABP领域层——领域事件(Domain events)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之14.ABP领域层——领域事件(Domain events) ABP是“ASP.NET Boilerplate P ...
- ABP领域层——领域事件(Domain events)
ABP领域层——领域事件(Domain events) 基于DDD的现代ASP.NET开发框架--ABP系列之14.ABP领域层——领域事件(Domain events) ABP是“ASP.NET B ...
随机推荐
- python爬虫遇到状态码304,705
304状态码是什么? 如果客户端发送了一个带条件的GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个304状态码.简单的表达就是:客户端已经 ...
- php设计模式七 ---组合模式
1.介绍 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结 ...
- 利用拷贝data目录文件的方式迁移mysql数据库
其实迁移数据库,一般用sql文件就行,把A服务器数据库的表结构和数据等等导出,然后导入到B服务器数据库, 但是这次数据文件过大,大约有40个G,使用命令行导入,效果不是很好,经常在执行过程中报错.卡死 ...
- 如何在jenkins上新建一个项目及其简单配置
1.首先,点击[新建]进入选择页面,如下图(一般选择"构建一个自由风格的软件项目") 2.填好项目名称后,点击ok,跳转至如下页面,可以在这个页面进行项目的配置(包括拉源码 ...
- 新手使用mac上的textedit写HTML时遇到的问题及解决办法
刚开始在mac上学习HTML,总结一下遇到的问题和解决办法 问题:使用textedit编写html,在网页上却仍然显示的是代码. 解决办法: 打开textedit后打开文本编辑 选择偏好设置 按如图所 ...
- 利用PCA降维
参考:<机器学习实战>- Machine Learning in Action 一. 基本思想 PCA(Principal Component Analysis),主成分分析.是目前应用 ...
- 作业01-Java基本概念
1.本周学习总结 本周学习了JVM,JDK,JRE三者之间的区别及联系,知道JDK包括JRE,JRE包括JVM,知道java语言与C语言的不同之处在于java语言可以依赖于虚拟机实现"编译一 ...
- Java暑假作业
一.电影观后感 电影<摔跤吧!爸爸>观后感 二.下学期的计划与目标 大一学年总结: 参与了大大小小的学院活动,例如机器人搭建.辩论赛,也参加了学生会的部门,参与了组织活动.通过参与活动获 ...
- ThreadLocal就是这么简单
前言 今天要研究的是ThreadLocal,这个我在一年前学习JavaWeb基础的时候接触过一次,当时在baidu搜出来的第一篇博文ThreadLocal,在评论下很多开发者认为那博主理解错误,给出了 ...
- Java面试题(二)
系统整理了一下有关Java的面试题,包括基础篇,javaweb篇,框架篇,数据库篇,多线程篇,并发篇,算法篇等等,陆续更新中.其他方面如前端后端等等的面试题也在整理中,都会有的. 注:文末有福利! 1 ...