1. 程式人生 > 實用技巧 >abp vnext 開發快速入門 2 實現基本增刪改查

abp vnext 開發快速入門 2 實現基本增刪改查

上篇說了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;
        }

編寫後呢就可以執行宿主服務測試剛剛建立好的這個服務了。