ABP入门系列(2)——领域层创建实体
這一節(jié)我們主要和領(lǐng)域?qū)?/strong>打交道。首先我們要對ABP的體系結(jié)構(gòu)以及從模板創(chuàng)建的解決方案進行一一對應(yīng)。網(wǎng)上有代碼生成器去簡化我們這一步的任務(wù),但是不建議初學者去使用。
一、首先來看看ABP體系結(jié)構(gòu)
ABP體系結(jié)構(gòu)
領(lǐng)域?qū)?/strong>就是業(yè)務(wù)層,是一個項目的核心,所有業(yè)務(wù)規(guī)則都應(yīng)該在領(lǐng)域?qū)訉崿F(xiàn)。
實體(Entity): 實體代表業(yè)務(wù)領(lǐng)域的數(shù)據(jù)和操作,在實踐中,通過用來映射成數(shù)據(jù)庫表。
倉儲(Repository): 倉儲用來操作數(shù)據(jù)庫進行數(shù)據(jù)存取。倉儲接口在領(lǐng)域?qū)佣x,而倉儲的實現(xiàn)類應(yīng)該寫在基礎(chǔ)設(shè)施層。
領(lǐng)域服務(wù)(Domain service): 當處理的業(yè)務(wù)規(guī)則跨越兩個(及以上)實體時,應(yīng)該寫在領(lǐng)域服務(wù)方法里面。
領(lǐng)域事件(Domain Event): 在領(lǐng)域?qū)佑行┨囟ㄇ闆r發(fā)生時可以觸發(fā)領(lǐng)域事件,并且在相應(yīng)地方捕獲并處理它們。
工作單元(Unit of Work): 工作單元是一種設(shè)計模式,用于維護一個由已經(jīng)被修改(如增加、刪除和更新等)的業(yè)務(wù)對象組成的列表。它負責協(xié)調(diào)這些業(yè)務(wù)對象的持久化工作及并發(fā)問題。
二、再來看看解決方案
解決方案
確定了解決方案下每個項目分別對應(yīng)那一層后,我們開始創(chuàng)建Task實體。
三、創(chuàng)建Task實體
1.在領(lǐng)域?qū)觿?chuàng)建Tasks文件夾,并創(chuàng)建Task實體類;
2.ABP中所有的實體類都繼承自Entity,而Entity實現(xiàn)了IEntity接口;而IEntity接口是一個泛型接口,通過泛型指定主鍵Id類型,默認的Entity的主鍵類型是int類型。
創(chuàng)建Task,肯定需要保存創(chuàng)建時間,可以通過實現(xiàn)審計模塊中的IHasCreationTime來實現(xiàn)這種通用功能。代碼如下:
?
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狀態(tài)枚舉。并添加了AssignedPerson導航屬性,用來保存分配任務(wù)到某個用戶。其中[Required]、[MaxLength]特性是用來進行輸入校驗的。
3.定義好實體之后,我們就要去DbContext中定義實體對應(yīng)的DbSet,以應(yīng)用Code First 數(shù)據(jù)遷移。找到我們的基礎(chǔ)服務(wù)層,即以EntityFramework結(jié)尾的項目中,找到DbContext類,添加以下代碼
?
//TODO: Define an IDbSet for your Entities...public IDbSet<Task> Tasks { get; set; }4.執(zhí)行Code First數(shù)據(jù)遷移。
- 打開程序包管理器控制臺,默認項目選擇Entityframework對應(yīng)的項目后。執(zhí)行Add-Migration Add_Task_Entity,創(chuàng)建遷移。
- 創(chuàng)建成功后,會在Migrations文件夾下創(chuàng)建時間_Add_Task_Entity格式的類文件。如果注意觀察,我們會發(fā)現(xiàn)Migrations文件夾下有個SeedData文件夾,顧名思義,這個文件夾下的類主要是用來進行預置種子數(shù)據(jù)的。我們可以參照已有類的寫法,來預置兩條Task。創(chuàng)建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,回車執(zhí)行遷移。執(zhí)行成功后,查看數(shù)據(jù)庫,Tasks表創(chuàng)建成功,且表中已存在兩條測試數(shù)據(jù)。
至此,Task實體類成功創(chuàng)建。
源碼已上傳至Github-LearningMpaAbp,可自行參考。
作者:圣杰
鏈接:https://www.jianshu.com/p/fde465ae599d
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
總結(jié)
以上是生活随笔為你收集整理的ABP入门系列(2)——领域层创建实体的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信信用卡还款什么时候到账
- 下一篇: IE浏览器已正式关闭 退役后还能用吗?附