上篇文章寫到下載模板,模板的結構簡單介紹、生成數據庫和基礎數據,然后並運行了項目,接下來咋們說說項目的擴展,新建一塊自己的業務,參照現有的項目架構,我們該怎么一步步增加自己的功能?
一、創建Book實體
前面有說道項目領域層是有兩塊組成:
在TestApp.BookStore.Domain創建一個Books的文件夾,並添加一個Book的基礎類,如下圖:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Volo.Abp.Domain.Entities.Auditing; namespace TestApp.BookStore.Books { public class Book :AuditedAggregateRoot<Guid> { public string Name { get; set; } public BookType Type { get; set; } public DateTime PublishDate { get; set; } public float Price { get; set; } } }
- ABP為實體提供了兩個基本的基類:
AggregateRoot
和Entity
. Aggregate Root是領域驅動設計 概念之一. 可以視為直接查詢和處理的根實體. Book
實體繼承了AuditedAggregateRoot
,AuditedAggregateRoot
類在AggregateRoot
類的基礎上添加了一些基礎審計屬性(例如CreationTime
,CreatorId
,LastModificationTime
等). ABP框架自動為你管理這些屬性.Guid
是Book
實體的主鍵類型.
由於Book實體包含
枚舉,所以在BookType
TestApp.BookStore.Domain.Shared
創建一個Books的文件夾,並添加一個BookType的基礎類,如下圖:

using System; using System.Collections.Generic; using System.Text; namespace TestApp.BookStore.Books { public enum BookType { Undefined, Adventure, Biography, Dystopia, Fantastic, Horror, Science, ScienceFiction, Poetry } }
二、將Book實體添加到DbContext中並映射到數據庫表中
EF Core需要你將實體和 DbContext
建立關聯.做法是在TestApp.BookStore.EntityFrameworkCore
項目的BookStoreDbContext
類
添加DbSet
屬性.如下所示:
public DbSet<Book> Books { get; set; }
OnModelCreating
方法,為Book
實體添加映射代碼:
builder.Entity<Book>(b => { b.ToTable(BookStoreConsts.DbTablePrefix + "Books",BookStoreConsts.DbSchema); b.ConfigureByConvention(); b.Property(x => x.Name).IsRequired().HasMaxLength(128); });
BookStoreConsts
含有用於表的架構和表前綴的常量值. 使用它不是強制的,但建議在統一的地方控制表前綴.ConfigureByConvention()
方法優雅的配置/映射繼承的屬性,應對所有的實體使用它.
可在數據模型添加初始化數據方便學習ABP Framework功能,如下圖(可忽略)
在 TestApp.BookStore.Domain項目下創建 IDataSeedContributor
的派生類

using System; using System.Threading.Tasks; using TestApp.BookStore.Books; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Repositories; namespace TestApp.BookStore { public class BookStoreDataSeederContributor : IDataSeedContributor, ITransientDependency { private readonly IRepository<Book, Guid> _bookRepository; public BookStoreDataSeederContributor(IRepository<Book, Guid> bookRepository) { _bookRepository = bookRepository; } public async Task SeedAsync(DataSeedContext context) { if (await _bookRepository.GetCountAsync() <= 0) { await _bookRepository.InsertAsync( new Book { Name = "1984", Type = BookType.Dystopia, PublishDate = new DateTime(1949, 6, 8), Price = 19.84f }, autoSave: true ); await _bookRepository.InsertAsync( new Book { Name = "The Hitchhiker's Guide to the Galaxy", Type = BookType.ScienceFiction, PublishDate = new DateTime(1995, 9, 27), Price = 42.0f }, autoSave: true ); } } } }
- 如果數據庫中當前沒有圖書,則此代碼使用
IRepository<Book, Guid>
(默認repository)將兩本書插入數據庫.
三、更新數據庫
由於數據表結構和初始化數據調整,所以需要更新下數據庫,將TestApp.BookStore.DbMigrator應用程序設為啟動項目,
來更新數據庫,運行完成會發現數據庫book表會多兩條默認數據,如下圖:
.DbMigrator
是一個控制台使用程序,可以在開發和生產環境遷移數據庫架構和初始化種子數據.
四、創建應用程序
前面也說道應用程序跟領域層類似都有兩塊組成:
創建一個應用程序服務,使用ABP Framework的 CrudAppService
基類來獲取,創建,更新和刪除書籍.
CrudAppService
基類需要定義實體的基本DTO.
在 TestApp.BookStore.Application.Contracts
項目中創建 Books
文件夾(命名空間),添加 BookDto
的DTO類:
using System; using System.Collections.Generic; using System.Text; using Volo.Abp.Application.Dtos; namespace TestApp.BookStore.Books { public class BookDto:AuditedEntityDto<Guid> { public string Name { get; set; } public BookType Type { get; set; } public DateTime PublishDate { get; set; } public float Price { get; set; } } }
六、運行Swagger UI測試API
可以嘗試執行[GET] /api/app/book
API來獲取書籍列表, 服務端會返回以下JSON結果:
到現在為止新增的Book模塊基本完成,下片接着介紹如何操作Book的增刪改查功能......