ABP理论学习之实体类

简介:

本篇目录

实体是DDD(领域驱动设计)的核心概念之一。Eirc Evans是这样描述的实体的:“它根本上不是通过属性定义的,而是通过一系列连续性和标识定义的”。因此,实体都有Id属性并且都存储到数据库中。一个实体一般会映射到数据库的一张表。

实体类

在ABP中,实体派生自Entity类,看下面的例子:

public class Person : Entity
{
    public virtual string Name { get; set; }

    public virtual DateTime CreationTime { get; set; }

    public Person()
    {
        CreationTime = DateTime.Now;
    }
}

上面定义了一个Person实体类,而且在Entity类中定义了一个Id属性,它是该Entity类的 主键。因此,所有实体的主键名都是相同的,都是Id

Id(主键)的类型是可以改变的,默认是int(int32)的。如果你想将Id定义为其他类型,可以像下面那样显示声明:

public class Person : Entity<long>
{
    public virtual string Name { get; set; }

    public virtual DateTime CreationTime { get; set; }

    public Person()
    {
        CreationTime = DateTime.Now;
    }
}

而且,你也可以把它设置为string,Guid或其他类型的。

Entity类重写了等号运算符(==),可以轻松地检查两个实体是否相同了(实体的Id相同则认为它们相同)。它也定义了IsTransient方法来检测它是否有Id。

惯例接口

在许多应用中,使用了相似的实体属性(和数据表中的字段),如CreationTime表明该实体是何时创建的。ABP提供了很多有用的接口来使得这些通用的属性变得明确并富有表现力。此外,这也为实现了这些接口的实体类提供了一种编写通用代码的方式。

审计

IHasCreationTime使得使用一个通用的属性来描述一个实体的“创建时间”信息成为可能。当实现了该接口的实体类插入到数据库中时,ABP会自动地将当前的时间设置给CreationTime。

public interface IHasCreationTime
{
    DateTime CreationTime { get; set; }
}

Person类可以通过实现IHasCreationTime接口来重写,如下所示:

public class Person : Entity<long>, IHasCreationTime
{
    public virtual string Name { get; set; }

    public virtual DateTime CreationTime { get; set; }

    public Person()
    {
        CreationTime = DateTime.Now;
    }
}

ICreationAudited通过增加了CreatorUserId扩展了IHasCreationTime:

public interface ICreationAudited : IHasCreationTime
{
    long? CreatorUserId { get; set; }
}

当保存一个新的实体时,ABP会自动地将当前的用户Id设置为CreatorUserId。

你也可以通过从CreationAuditedEntity类派生实体,从而轻易地实现ICreationAudited。

对于修改也有相似的接口:

public interface IModificationAudited
{
    DateTime? LastModificationTime { get; set; }

    long? LastModifierUserId { get; set; }
}

当更新一个实体的时候,ABP也会自动地设置这些属性。你只需要为你的实体实现这些接口即可。

如果你想实现所有的审计属性,那么你可以直接实现IAudited接口:

public interface IAudited : ICreationAudited, IModificationAudited
{
        
}

作为一个快捷方式,你可以从AuditedEntity类派生,而不需要直接实现IAudited。AuditedEntity类对于不同类型的Id属性也有泛型的版本。

软删除

软删除是将一个实体标记为已删除的通常使用的模式,而不是直接从数据库中删除。比如,你可能不想从数据库中硬删除一个User,因为它可能关联其他的表。ISoftDelete接口用于下面的目的:

public interface ISoftDelete
{
    bool IsDeleted { get; set; }
}

ABP实现了开箱即用的软删除模式。当一个软删除实体被删除后,ABP检测到之后,会阻止删除,将IsDeleted设置为true并更新数据库中的实体。而且,它会自动地过滤数据库中软删除的实体,不会检索(select)它们。

如果使用了软删除,那么你可能想存储一些信息,比如何时删除以及谁删除了一个实体等等。你可以实现下面演示的IDeletionAudited接口:

public interface IDeletionAudited : ISoftDelete
{
    long? DeleterUserId { get; set; }

    DateTime? DeletionTime { get; set; }
}

IDeletionAudited扩展了ISoftDelete,当删除一个实体时,ABP会自动设置这些属性。

如果你想为一个实体实现所有的审计接口(创建,修改和删除),那么可以直接实现IFullAudited,因为它继承了所有的这些接口:

public interface IFullAudited : IAudited, IDeletionAudited
{
        
}

同样的,作为一个快捷方式,你可以从FullAuditedEntity类派生你的实体类从而实现所有的审计接口。

注意:所有的审计接口和类都有一个定义导航属性到User实体的泛型版本(比如ICreationAudited和FullAuditedEntity)。,tuser>

激活/未激活

一些实体需要标记为激活的或未激活的。这样,你就可以根据实体的激活或者未激活状态来采取行动。你可以实现IPassivable接口来达到目的。该接口定义了IsActive属性。

如果实体在第一次创建时是激活的,那么你可以在构造函数中将IsActive设置为true。

这与软删除(IsDeleted)是不同的。如果一个实体是软删除的,那么它就不会从数据库中检索到了(ABP默认会阻止),但是,对于激活或者未激活的实体,控制获取实体完全取决于你。

IEntity接口

实际上,Entity类实现了IEntity接口(且Entity实现了IEntity)。如果不想从Entity类中派生,那么可以直接实现这些接口。但是,除非你有一个好的原因不从Entity类派生,否则,不建议这么做。





本文转自tkbSimplest博客园博客,原文链接:http://www.cnblogs.com/farb/p/ABPEntity.html,如需转载请自行联系原作者

目录
相关文章
|
8月前
|
负载均衡 算法 定位技术
负载均衡
负载均衡
322 57
|
JavaScript Java 测试技术
基于SpringBoot+Vue的高考志愿填报辅助系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的高考志愿填报辅助系统的详细设计和实现(源码+lw+部署文档+讲解等)
263 1
|
存储 安全 物联网
未来已来:探索新兴技术的发展趋势与应用前景
【8月更文挑战第14天】随着科技的飞速发展,新兴技术如区块链、物联网和虚拟现实等正在逐渐改变我们的生活和工作方式。本文将深入探讨这些技术的发展现状和未来趋势,以及它们在不同领域的应用场景。我们将从技术创新的角度出发,分析这些技术如何推动社会进步,并讨论它们面临的挑战和机遇。通过对未来技术趋势的预测,我们可以更好地准备迎接即将到来的变革。
287 0
|
编解码 监控 调度
GPU实例使用--vGPU资源利用率的提升、监控与告警的实现
随着AI计算及云游戏为代表的图形渲染业务的飞速发展,越来越多的企业和个人开始使用GPU实例。同时,由于GPU算力资源成本较高,对于负载相对较小的业务,客户会更倾向于选择使用1/2或者1/4甚至更小的vGPU实例来运行其业务,vGPU技术随之得以迅速发展。
|
域名解析 编解码 网络协议
【实操手册】一篇文章教你快速开始使用视频点播
阿里云视频点播(VoD)是集音视频采集、编辑、上传、自动化转码处理、媒体资源管理、分发加速、视频播放于一体的一站式音视频点播解决方案。 用户可以通过阿里云管理控制台进行基本和高级 VoD 配置、操作,还可以通过视频点播开发工具包(SDK)或直接在应用程序中进行 RESTful API 调用执行基本和高级 VOD任务。
4439 0
|
搜索推荐
小技巧 - 如何在百度搜索到自己的网站(新站必看)?
小技巧 - 如何在百度搜索到自己的网站(新站必看)?
2095 0
小技巧 - 如何在百度搜索到自己的网站(新站必看)?
|
存储 人工智能 边缘计算
独家首发 | 阿里巴巴新基建洞察系列——《5G智能经济应用场景》研究报告正式发布
大家有没有注意到,5G全球商用其实已经超过1年了,中国也超过半年了,但是大家似乎身边并没有感受到5G带来的变化,甚至连5G手机都看不到几款。5G真的会引爆行业应用和机遇吗?新一轮数字基建驱动下,5G行业应用将往什么方向走?《阿里巴巴新基建洞察之5G智能经济应用场景》带你解锁5G时代应用场景。
10030 0
独家首发 | 阿里巴巴新基建洞察系列——《5G智能经济应用场景》研究报告正式发布
|
Prometheus 监控 Kubernetes
通过Kubernetes监控探索应用架构,发现预期外的流量
Kubernetes 监控立足于应用监控之下的 Kubernetes 容器界面和底层操作系统,是 Kubernetes 集群软件栈端到端可观测性的一体化解决方案,在 Kubernetes 监控中可以同时看到关联的所有层的观测数据。我们希望通过 Kubernetes 监控的一系列最佳实践,让大家能够使用 Kubernetes 监控解决 Kubernetes 环境下棘手的可观测问题。
通过Kubernetes监控探索应用架构,发现预期外的流量
|
弹性计算 运维 安全
什么是裸金属服务器?裸金属服务器、物理机和云服务器区别及优缺点对比
什么是裸金属服务器?裸金属服务器和物理机有有什么区别?裸金属服务器和物理机的区别及优缺点对比:
|
搜索推荐 大数据 测试技术
千人千面超级APP上线,阿里云助海底捞实现“云上捞”
11月29日消息,海底捞与阿里云的合作结出硕果:搭载阿里云的先进技术,海底捞打造出千人千面的超级APP,旨在为顾客提供服务升级新体验。
5495 0