前面一片随笔已经介绍怎么下载以及生成源码,下面我就跟随ABP官方文档搭建书店项目。
当然,这些源码在官网上面都是可以找到的。
首先还是根据上一篇随笔的步骤生成项目,不过将项目命名为Acme.BookStore。
ABP的领域层分为两个类库Domian和Domain.Shared
Domain主要存放实体,服务和领域对象,Domain.Shared存放变量,枚举以及领域相关类
书店主要类就是Book,在Domain类库下面创建Books文件夹,并添加Book类
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(实体),他们都是DDD(领域驱动编程)的概念,不了解的自行百度。
也就是说你创建了一个Id为Guid类型的类Book,还需要引用枚举类型的BookType
在Domian.Shared创建Books文件夹,并新建BookType
public enum BookType
{
Undefined,
Adventure,
Biography,
Dystopia,
Fantastic,
Horror,
Science,
ScienceFiction,
Poetry
}
在.EntityFrameworkCore类库中找到BookStoreDbContext,也就是项目的上下文类,然后添加 public DbSet<Book> Books { get; set; }
接下来就是将实体和数据库的表进行匹配,找到BookStoreModelCreatingExtensions,添加;
builder.Entity<Book>(b =>
{
b.ToTable(BookStoreConsts.DbTablePrefix + "Books",
BookStoreConsts.DbSchema);
b.ConfigureByConvention(); //auto configure for the base class props
b.Property(x => x.Name).IsRequired().HasMaxLength(128);
});
BookStoreConsts里面包含了表的前缀和模式(Schema)
ConfigureByConvention()配置继承属性
打开程序包管理器控制台(工具-Nuget包管理器),将EntityFrameworkCore.DbMigrations设成默认类库,执行命令 Add-Migration "Created_Book_Entity"
插入初始化数据:
在.Domain类库中新增BookStoreDataSeederContributor
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 ); } } }
运行.Migrator类库修改数据库
ABP的应用层也分为两层:
Application.Contracts:包含DTO(数据传输对象)和应用服务接口
Application:应用服务实现
创建数据传输对象BookDto:
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; } }
DTO类是用来在展示层和应用层之间转存数据
当传输数据信息到展示层(前端UI),需要将Book和BookDto进行匹配
AutoMapper会帮你自动转化,只需要在.Application类库中找到ApplicationAutoMapperProfile,并添加如下配置:
public BookStoreApplicationAutoMapperProfile() { CreateMap<Book, BookDto>(); }
创建CreateUpdateBookDto用于从 UI层获取创建和修改的书籍信息
public class CreateUpdateBookDto { [Required] [StringLength(128)] public string Name { get; set; } [Required] public BookType Type { get; set; } = BookType.Undefined; [Required] [DataType(DataType.Date)] public DateTime PublishDate { get; set; } = DateTime.Now; [Required] public float Price { get; set; } }
和上面一样进行匹配
CreateMap<CreateUpdateBookDto, Book>();
在.Application.Contracts中定义接口IBookAppService
public interface IBookAppService : ICrudAppService< //Defines CRUD methods BookDto, //Used to show books Guid, //Primary key of the book entity PagedAndSortedResultRequestDto, //Used for paging/sorting CreateUpdateBookDto> //Used to create/update a book { }
在.Application中定义实现:
public class BookAppService : CrudAppService< Book, //The Book entity BookDto, //Used to show books Guid, //Primary key of the book entity PagedAndSortedResultRequestDto, //Used for paging/sorting CreateUpdateBookDto>, //Used to create/update a book IBookAppService //implement the IBookAppService { public BookAppService(IRepository<Book, Guid> repository) : base(repository) { } }
运行项目,启动Swagger里面的[Get]api/app/book 就会看到刚才初始化的两个数据