ABP入門系列(3)-領域層創建實體

黄舟
發布: 2017-01-16 17:24:03
原創
2147 人瀏覽過

這一節我們主要和領域層打交道。首先我們要對ABP的體系結構以及從範本建立的解決方案進行一一對應。網路上有程式碼產生器去簡化我們這一步的任務,但不建議初學者去使用。

一、首先來看看ABP體系結構

ABP入門系列(3)-領域層創建實體

領域層就是業務層,是一個專案的核心,所有業務規則都應該在領域層實現。
實體(Entity): 實體代表業務領域的資料和操作,在實務中,透過用來映射成資料庫表。
倉儲(Repository): 倉儲用來操作資料庫進行資料存取。倉儲介面在領域層定義,而倉儲的實作類別應該寫在基礎設施層。
領域服務(Domain service): 當處理的業務規則跨越兩個(及以上)實體時,應該寫在領域服務方法裡面。
領域事件(Domain Event): 在領域層有些特定情況發生時可以觸發領域事件,並且在相應地方捕獲並處理它們。
工作單元(Unit of Work): 工作單元是一種設計模式,用於維護一個由已經被修改(如增加、刪除和更新等)的業務對象組成的清單。它負責協調這些業務對象的持久化工作及並發問題。

二、再來看看解決方案

ABP入門系列(3)-領域層創建實體

確定了解決方案下每個項目分別對應那一層後,我們開始創建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;//64kb                
 public 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)       
   {          
    _context.Tasks.Add(task);         
       _context.SaveChanges();      
         }    
         }
         }
         }
登入後複製

然後在Configuration類別中的Seed方法中,加入以下程式碼。

new DefaultTestDataForTask(context).Create();
登入後複製

在程式包管理器控制台,輸入Update-Database,回車執行遷移。執行成功後,查看資料庫,Tasks表建立成功,且表中已存在兩條測試資料。

至此,Task實體類別成功建立。
原始碼已上傳至Github-LearningMpaAbp,可自行參考。
ABP入門系列目錄-學習Abp框架之實操演練

以上就是ABP入門系列(3)——領域層創建實體的內容,更多相關內容請關注PHP中文網(www.php.cn )!


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板