Abp vNext项目学习(2)基于ABP搭建书店项目

  前面一片随笔已经介绍怎么下载以及生成源码,下面我就跟随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 就会看到刚才初始化的两个数据

  

记录编程的点滴,体会学习的乐趣
原文地址:https://www.cnblogs.com/AduBlog/p/13415447.html