上篇說了abp vnext 的大體框架結構,本篇說下如何實現基礎的增刪改查。實現增刪改查有以下幾個步驟:
1、配置數據庫連接
2、領域層(Domain)創建實體,Ef core 層配置Dbset( 用的Ef core code first) ,自動創建數據庫和表
3、ApplicationContract 層編寫Dto(數據傳輸對象)
4、Application 層設置AutoMap, 編寫增刪改查方法
5、運行宿主服務,這里用到了swagger,用swagger 進行測試。
我就一個一個步驟挨着說一下,首先第一個
1、配置數據庫連接,找到宿主服務,上篇說道是.HttpApi.Host,這個項目下有個appsettings.json,這個文檔里找到ConnectionStrings,默認生成的Default 和項目名相關的一個連接。主要是把項目名相關的這個數據庫連接改成真實的,Default那個看心情改,目前沒發現有什么用還。比如
"ConnectionStrings": { "Default": "Server=.;Database=SoftwarePortal_Main;User ID=sa;Password=123456;", "Test": "Server=.;Database=SoftwarePortal_Module;User ID=sa;Password=123456;" },
2、領域層創建實體
到Domain層創建要用到的實體。這塊跟普通的netcore 差不多了,直接列代碼,我這個代碼是項目中的用到的 “類別”的實體。
[Table("Categories")] public class Category : FullAuditedEntity<Guid> { /// <summary> /// 類別名稱 /// </summary> [MaxLength(50), Required] public string CategoryName { get; set; } /// <summary> /// 父級 /// </summary> [Required] public Guid ParentID { get; set; } /// <summary> /// 排序 /// </summary> [Required] public int Sort { get; set; } /// <summary> /// 屬性列表 /// </summary> public IList<AttributeInfo> AttributeInfoList { get; set; } /// <summary> /// 屬性組列表 /// </summary> public IList<AttributeGroup> AttributeGroupList { get; set; } }
以上可以發現繼承了FullAuditedEntity<Guid>,之所以這樣是因為可以用到abp框架里的自帶的比如ID , IsDeleted,DeleterId,DeletionTime 等等這些,而且繼承這個看文檔說的用框架做刪除操作。默認的不是真實刪除,而是邏輯刪除。
編寫好實體后,Ef core 層寫DbSet,主要在兩個地方:
在DbContext類加上
public DbSet<Category> Categories { get; set; }
在DbContextModelCreatingExtensions類加上
builder.Entity<Category>();
加完這些就可以運行自動創建或更新數據庫的命令了。
3、ApplicationContract 層 添加Dto,Dto是數據傳輸對象。這個應該很多人不陌生,就是用來接收前端傳過來的數據或者把后端產生的數據轉為前端能看的數據。可以通過Automap與后端數據進行數據轉換。這里舉例接收創建一個Category數據的Dto
public class CreateCategoryDto { /// <summary> /// 類別名稱 /// </summary> [MaxLength(50, ErrorMessage = "名稱最長50"), Required(ErrorMessage = "名稱必填")] public string CategoryName { get; set; } /// <summary> /// 父級 /// </summary> [Required(ErrorMessage = "上級必填")] public Guid ParentID { get; set; } /// <summary> /// 排序 /// </summary> [Required(ErrorMessage = "排序必填")] public int Sort { get; set; } }
通過這個Dto,可以實現數據接收,也能自動實現數據校驗
4、編寫好Dto后,在Application層下的AutomapperProfile文件里編寫
CreateMap<CreateCategoryDto, Category>(MemberList.Source);
做下映射。
然后Application層下創建一個CategoryAppService 的類(這個類繼承ApplicationService,否則無法直接用ObjectMapper),里邊放關於Category的一系列操作的方法。比如創建操作方法
/// <summary> /// 創建類別 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<ApiResponse> CreateAsync(CreateCategoryDto input) { var category = ObjectMapper.Map<CreateCategoryDto, Category>(input); var categoryAdd = await _categoryRepository.InsertAsync(category); return new ApiResponse("創建成功", ObjectMapper.Map<Category, CategoryDto>(categoryAdd),SoftwarePortalErrorCodes.Success); }
其中 _categoryRepository 是這樣聲明的,利用了abp vnext自帶的倉儲
private readonly IRepository<Category, Guid> _categoryRepository; public CategoryAppService(IRepository<Category, Guid> repository) { _categoryRepository = repository; }
編寫后呢就可以運行宿主服務測試剛剛創建好的這個服務了。