ABP入门系列(2)——领域层创建实体

这一节我们主要和领域层打交道。首先我们要对ABP的体系结构以及从模板创建的解决方案进行一一对应。网上有代码生成器去简化我们这一步的任务,但是不建议初学者去使用。

一、首先来看看ABP体系结构

ABP体系结构

领域层就是业务层,是一个项目的核心,所有业务规则都应该在领域层实现。
实体(Entity): 实体代表业务领域的数据和操作,在实践中,通过用来映射成数据库表。
仓储(Repository): 仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。
领域服务(Domain service): 当处理的业务规则跨越两个(及以上)实体时,应该写在领域服务方法里面。
领域事件(Domain Event): 在领域层有些特定情况发生时可以触发领域事件,并且在相应地方捕获并处理它们。
工作单元(Unit of Work): 工作单元是一种设计模式,用于维护一个由已经被修改(如增加、删除和更新等)的业务对象组成的列表。它负责协调这些业务对象的持久化工作及并发问题。

二、再来看看解决方案

解决方案

确定了解决方案下每个项目分别对应那一层后,我们开始创建Task实体。

三、创建Task实体

1.在领域层创建Tasks文件夹,并创建Task实体类;
2.ABP中所有的实体类都继承自Entity,而Entity实现了IEntity接口;而IEntity接口是一个泛型接口,通过泛型指定主键Id类型,默认的Entity的主键类型是int类型。
创建Task,肯定需要保存创建时间,可以通过实现审计模块中的IHasCreationTime来实现这种通用功能。代码如下:

 

namespace LearningMpaAbp.Tasks
{public class Task : Entity, IHasCreationTime{public const int MaxTitleLength = 256;public const int MaxDescriptionLength = 64 * 1024;//64kbpublic long? AssignedPersonId { get; set; }[ForeignKey("AssignedPersonId")]public User AssignedPerson { get; set; }[Required][MaxLength(MaxTitleLength)]public string Title { get; set; }[Required][MaxLength(MaxDescriptionLength)]public string Description { get; set; }public TaskState State { get; set; }public DateTime CreationTime { get; set; }public Task(){CreationTime = Clock.Now;State = TaskState.Open; ;}public Task(string title, string description = null) : this(){Title = title;Description = description;}}public enum TaskState : byte{Open = 0,Completed = 1}
}

其中定义了TaskState状态枚举。并添加了AssignedPerson导航属性,用来保存分配任务到某个用户。其中[Required]、[MaxLength]特性是用来进行输入校验的。

3.定义好实体之后,我们就要去DbContext中定义实体对应的DbSet,以应用Code First 数据迁移。找到我们的基础服务层,即以EntityFramework结尾的项目中,找到DbContext类,添加以下代码

 

//TODO: Define an IDbSet for your Entities...public IDbSet<Task> Tasks { get; set; }

4.执行Code First数据迁移。

  • 打开程序包管理器控制台,默认项目选择Entityframework对应的项目后。执行Add-Migration Add_Task_Entity,创建迁移。
  • 创建成功后,会在Migrations文件夹下创建时间_Add_Task_Entity格式的类文件。如果注意观察,我们会发现Migrations文件夹下有个SeedData文件夹,顾名思义,这个文件夹下的类主要是用来进行预置种子数据的。我们可以参照已有类的写法,来预置两条Task。创建DefaultTestDataForTask类,代码如下:

 

namespace LearningMpaAbp.Migrations.SeedData
{public class DefaultTestDataForTask{private readonly LearningMpaAbpDbContext _context;private static readonly List<Task> _tasks;public DefaultTestDataForTask(LearningMpaAbpDbContext context){_context = context;}static DefaultTestDataForTask(){_tasks = new List<Task>(){new Task("Learning ABP deom", "Learning how to use abp framework to build a MPA application."),new Task("Make Lunch", "Cook 2 dishs")};}public void Create(){foreach (var task in _tasks){if (_context.Tasks.FirstOrDefault(t => t.Title == task.Title) == null){_context.Tasks.Add(task);}_context.SaveChanges();}}}
}

然后在Configuration类中的Seed方法中,添加以下代码。

 

new DefaultTestDataForTask(context).Create();
  • 在程序包管理器控制台,输入Update-Database,回车执行迁移。执行成功后,查看数据库,Tasks表创建成功,且表中已存在两条测试数据。

至此,Task实体类成功创建。
源码已上传至Github-LearningMpaAbp,可自行参考。



作者:圣杰
链接:https://www.jianshu.com/p/fde465ae599d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

云计算-Linux-远程连接,Linux岗位介绍

云计算-Linux-远程连接,Linux岗位介绍 使用Xshell,CRT等工具,可以连接到linux主机里面,SSH是默认打开的, 然后就不需要这个在vm里面的那个窗口操作,可以在这个软件里面直接操作 以这个xshell为例子 直接ssh ip地址即可 这个呢机器装完了,就讲讲这个linux的岗位介绍吧 这个的…

云计算-Linux系统基本概念,命令终端字段含义介绍,命令行格式介绍

云计算-Linux系统基本概念,命令终端字段含义介绍,命令行格式介绍 Linux系统的概念 1.多用户系统,允许多个用户登录系统,使用系统的资源(跟windows不一样,比如RDP远程连接,他只能一个用户在,其他用户上来就把他挤掉了) 最高是65535,因为端口一共就这么多,不过实际上不会这样干…

三层架构与MVC的区别

我们平时总是将混为一谈&#xff0c;殊不知它俩并不是一个概念。下面我来为大家揭晓我所知道的一些真相。 首先&#xff0c;它俩根本不是一个概念。 三层架构是一个分层式的软件体系架构设计&#xff0c;它可适用于任何一个项目。 MVC是一个设计模式&#xff0c;它是根据项目的…

云计算-Linux文件类型介绍,归属关系,基本权限介绍

云计算-Linux文件类型介绍,归属关系,基本权限介绍 这个点我是真滴不困好吧,学习吧那就~ 隐藏文件 上一章没有讲,这个呢,ls -a的命令他是可以显示隐藏的文件的,那问题来了,在windows里面我们可以看到的隐藏文件是暗色的,那么Linux里面的是? 是这样的哦 在Linux里面,文件的前面…

为什么DDD是设计微服务的最佳实践

在本人的前一篇文章《不要把微服务做成小单体》中&#xff0c;现在很多的微服务开发团队在设计和实现微服务的时候觉得只要把原来的单体拆小&#xff0c;就是微服务了。但是这不一定是正确的微服务&#xff0c;可能只是一个拆小的小单体。这篇文章让我们从这个话题继续&#xf…

浅析DDD(领域驱动设计)

最近在做一些微服务相关的设计&#xff0c;内容包括服务的划分&#xff0c;Restful API的设计等。其中比较棘手的就是Service的职责划分&#xff1a;如何抽象具有统一业务范畴的Model&#xff0c;使其模块化&#xff0c;又如何高度提炼并组合多模块&#xff0c;使得业务可独立服…

Microsoft Azure 中的 SharePoint Server 2013 灾难恢复

摘要&#xff1a; 使用 Azure&#xff0c;你可以为内部部署 SharePoint 服务器场创建灾难恢复环境。本文介绍如何设计和实施此解决方案。 观看 SharePoint Server 2013 灾难恢复概述视频 当灾难袭击你的 SharePoint 内部部署环境时&#xff0c;头等大事是迅速使系统恢复运行。…

ELK Stack 与 Elastic Stack 的异同点

在很多场合&#xff0c;都可以看到 ELK Stack 或者是 Elastic Stack 的介绍&#xff0c;大多数人都会产生疑问&#xff0c;这两者到底有什么区别&#xff1f;本文将介绍 ELK Stack 与 Elastic Stack 的异同点。 什么是 ELK Stack 那么&#xff0c;什么是 ELK &#xff1f; “…

详解日志采集工具--Logstash、Filebeat、Fluentd、Logagent对比

概述 常见的日志采集工具有Logstash、Filebeat、Fluentd、Logagent、rsyslog等等&#xff0c;那么他们之间有什么区别呢?什么情况下我们应该用哪一种工具? Logstash Logstash是一个开源数据收集引擎&#xff0c;具有实时管道功能。Logstash可以动态地将来自不同数据源的数据…

云计算-Linux-计算机硬件组成介绍-Linux系统目录介绍

云计算-Linux-计算机硬件组成介绍-Linux系统目录介绍 计算机硬件组成部分 这个感觉就真滴教超级小白了,但是还是讲讲吧 虽然我也感觉在这个地方讲怪怪的 输出设备:鼠标,键盘,触控板 主机设备:主机,CPU,内存,网卡,声卡,显卡 输出设备:屏幕,耳机,打印机 外部存储设备:硬盘,u盘…

rsyslog syslog详解

前言&#xff1a; rsyslog 是一个 syslogd 的多线程增强版。syslog是Linux系统默认的日志守护进程。默认的syslog配置文件是/etc/syslog.conf文件。程序&#xff0c;守护进程和内核提供了访问系统的日志信息。因此&#xff0c;任何希望生成日志信息的程序都可以向 syslog 接口…

第一节:框架前期准备篇之Log4Net日志详解

一. Log4Net简介 Log4net是从Java中的Log4j迁移过来的一个.Net版的开源日志框架&#xff0c;它的功能很强大&#xff0c;可以将日志分为不同的等级&#xff0c;以不同的格式输出到不同的存储介质中&#xff0c;比如&#xff1a;数据库、txt文件、内存缓冲区、邮件、控制台、ANS…

第二节:框架前期准备篇之AutoFac常见用法总结

一. 说在前面的话 凡是大约工作在两年以上的朋友们&#xff0c;或多或少都会接触到一些框架搭建方面的知识&#xff0c;只要一谈到框架搭建这个问题或者最佳用法这个问题&#xff0c;势必会引起一点点小小的风波&#xff0c;我说我的好&#xff0c;他说他的好&#xff0c;非常容…

第三节:框架前期准备篇之利用Newtonsoft.Json改造MVC默认的JsonResult

一. 背景 在MVC框架中&#xff0c;我们可能经常会用到 return Json()&#xff0c;而Json方法内部又是一个JsonResult类&#xff0c;那么JsonResult内部又是什么原理呢&#xff1f;在MVC框架中&#xff0c;各种xxxResult便捷了我们的开发&#xff0c;但这些都不是本节的重点&…

php 跳转qq群代码_邪少xml论坛qqxml代码—QQ音乐可播放框架QQ群任意跳转个人网站链接引流...

邪少XML论坛xml代码—QQ音乐可播放框架效果图&#xff1a;代码如下&#xff1a;<?xml version1.0 encodingUTF-8 standaloneyes ?><msg serviceID"2" templateID"1" action"web" brief"[分享] 古分一道桥" sourceMsgId&quo…

第四节:框架前期准备篇之进程外Session的两种配置方式

一. 基本介绍 1. 背景&#xff1a;Asp.Net默认的Session机制是进程内&#xff0c;存储在服务器端内存中&#xff0c;有这么几个缺点&#xff1a; ①&#xff1a;既然存在内存中&#xff0c;空间有限&#xff0c;不能存储大数据量信息&#xff0c;数据量多的话Session会被挤爆。…

广播延时大约多久_在长沙广播电台打广告要多少钱?

在长沙这个堵城&#xff0c;特别是每天上下班高峰期&#xff0c;很多人都堵在车里。有调查统计显示&#xff0c;长沙市高峰拥堵延时指数1.711&#xff0c;即高峰出行时间是畅通状态下的1.711倍&#xff0c;高峰平均行车速度24.9km/h。在堵车的时候&#xff0c;容易着急上火&…

云计算-Linux-用户管理,用户信息文件详解

云计算-Linux-用户管理,用户信息文件详解 这个就不讲啥了,用户干啥用的还能不知道吗 这个用户目录是在这/etc/skel下的 创建用户 useradd(只有root才能用) 扩展参数 -u指定用户的UID -d指定用户的家目录 -c指定用户的描述信息(备注) -g指定用户基本组 -G指定用户附加组 -s…

第五节:框架前期准备篇之锁机制处理并发

一. 简介 (一). 在处理并发的这个问题上&#xff0c;锁大致分为两类&#xff1a;悲观锁和乐观锁。 1. 悲观锁&#xff1a;悲观的认为每次去拿数据的时候都会被别人修改&#xff0c;所以每次在拿数据的时候都会“上锁”&#xff0c;操作完成之后再“解锁”。 在数据加锁期间&a…

表面粗糙度的基本评定参数是_表面粗糙度100问,讲得明明白白

提醒&#xff1a;点上方↑↑↑“制造原理”订阅后 满足你的好奇来源&#xff1a;机械工程师1&#xff0e; 什么称为表面粗糙度&#xff1f;答&#xff1a;表面粗糙度是指零件加工表面上具有的由较小间距和峰谷所组成的微观几何形状特征。它是一种微观几何形状误差。2&#xff0…