• 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 就会看到刚才初始化的两个数据

      

    记录编程的点滴,体会学习的乐趣
  • 相关阅读:
    第六周 组合数据类型
    第五周 函数和代码复用
    第四周 程序的控制结构
    第三周 Python基本数据类型
    python库
    sublime text3自定义设置及快捷键大全
    Sublime Text3插件安装教程
    Linux 标准目录结构
    快学Scala-10--List 和Set
    快学Scala-09--模式匹配
  • 原文地址:https://www.cnblogs.com/AduBlog/p/13415447.html
Copyright © 2020-2023  润新知