一、首先來看看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
來實現這種通用功能。代碼如下:

using Abp.Domain.Entities; using Abp.Domain.Entities.Auditing; using MyProject.Authorization.Users; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MyProject.Tasks { public class Task : Entity, IHasCreationTime { public const int MaxTitleLength = 256; public const int MaxDescriptionLength = 64 * 1024; public long? AssignePersonId { get; set; } [ForeignKey("AssignePersonId")] public User AssignePerson { 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 = DateTime .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類,添加以下代碼

4.執行Code First數據遷移。
- 打開程序包管理器控制台,默認項目選擇Entityframework對應的項目后。執行
Add-Migration Add_Task_Entity
,創建遷移。 - 創建成功后,會在Migrations文件夾下創建
時間_Add_Task_Entity
格式的類文件。如果注意觀察,我們會發現Migrations文件夾下有個SeedData文件夾,顧名思義,這個文件夾下的類主要是用來進行預置種子數據的。我們可以參照已有類的寫法,來預置兩條Task。創建DefaultTestDataForTask
類,代碼如下: -
using System; using System.Collections.Generic; using System.Linq; using System.Text; using MyProject.EntityFramework; using MyProject.MultiTenancy; using MyProject.Tasks; namespace MyProject.Migrations.SeedData { public class DefaultTestDataForTask { private readonly MyProjectDbContext _context; private static readonly List<Task> _tasks; public DefaultTestDataForTask(MyProjectDbContext 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) { _context.Tasks.Add(task); _context.SaveChanges(); } } } }
然后在Configuration
類中的Seed
方法中,添加以下代碼。
- 在程序包管理器控制台,輸入
Update-Database
,回車執行遷移。執行成功后,查看數據庫,Tasks表創建成功,且表中已存在兩條測試數據。
至此,Task實體類成功創建。