zoukankan      html  css  js  c++  java
  • Abp VNext 入门——让ABP跑起来

    因好多群友@我说,ABP他们简单的了解了下,按照官方的教程一路下来跑不起来(倒在了入门的门口),才有了此文。

    此文结合官方文档,一步一步带领大家让ABP跑起来(跨过门口)。

    建议大家一步一步实际动手操作下

    一、Abp 简介

    ABP是用于创建现代Web应用程序的完整架构和强大的基础设施! 遵循最佳实践和约定,为你提供SOLID开发经验.

    ABP 是一个开源应用程序框架,专注于基于ASP.NET Core的Web应用程序开发,但也支持开发其他类型的应用程序.

    二、项目创建

    作为入门,这里就不使用CLI创建了,使用在线创建项目,在线地址:https://abp.io/get-started,为了演示,项目名称就用官方的Acme.BookStore

    Abp VNext 入门——让ABP跑起来

     

    下载完解压后,使用VS2019 打开后

    Abp VNext 入门——让ABP跑起来

     

    下面我将带领大家搭建一个简单的CURD,并简单的带大家认识它的分层及各层是干啥的。

    三、开发教程

    3.1、在 Acme.BookStore.Domain.Share 层下创建 BookType 枚举

     public enum BookType
        {
            Undefined,
            Adventure,
            Biography,
            Dystopia,
            Fantastic,
            Horror,
            Science,
            ScienceFiction,
            Poetry
        }

    3.2、在 Acme.BookStore.Domain 层下创建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; }
        }

    3.3、在 Acme.BookStore.EntityFrameworkCore 层下的 BookStoreDbContext 类中将 Book 实体加入

    [ConnectionStringName("Default")]
    public class BookStoreDbContext : AbpDbContext<BookStoreDbContext>
    {
       public DbSet<AppUser> Users { get; set; }
    
       public DbSet<Book> Books { get; set; }
     }

    3.4、将 Book 实体映射到数据库表中

    在 Acme.BookStore.EntityFrameworkCore 层下的 BookStoreDbContextModelCreatingExtensions 类中的 ConfigureBookStore 方法中添加 Book 实体的映射文件

        public static class BookStoreDbContextModelCreatingExtensions
        {
            public static void ConfigureBookStore(this ModelBuilder builder)
            {
                Check.NotNull(builder, nameof(builder));
                builder.Entity<Book>(b =>
                {
                    b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema);
                    b.ConfigureByConvention();
                    b.Property(x => x.Name).IsRequired().HasMaxLength(128);
                });
            }
        }

    3.5、数据迁移

    • 打开 程序包管理器控制台(PMC)
    Abp VNext 入门——让ABP跑起来

     

    • 选择 Acme.BookStore.EntityFrameworkCore.DbMigrations 作为默认项目并使用 Add-Migraction 命令迁移项目 成功后会创建一个迁移类
    Abp VNext 入门——让ABP跑起来

     

    Abp VNext 入门——让ABP跑起来

     

    3.6、添加种子数据(可选)

    在 Acme.BookStore.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
                    );
                }
            }
        }

    3.7、更新数据库

    将 Acme.BookStore.DbMigrator 设为启动项目,并更改它下面的 appsettings.json 文件

    更改 appsettings.json 文件中的数据库连接字符串(这里我使用VS自带的SqlServer数据库)。

    3.7.1、视图 —> SQL Server对象资源管理器

    Abp VNext 入门——让ABP跑起来

     

    3.7.2、创建数据库 BootStore

    Abp VNext 入门——让ABP跑起来

     

    Abp VNext 入门——让ABP跑起来

     

    3.7.3、获取连接字符串

     

    Abp VNext 入门——让ABP跑起来

     

    Abp VNext 入门——让ABP跑起来

     

    3.7.4、更改 appsettings.json ,将上一步复制的数据库连接字符串替换到 ConnectionString->Default 的 值中

     

    Abp VNext 入门——让ABP跑起来

     

    3.7.5、F5运行项目

     

    Abp VNext 入门——让ABP跑起来

     

    3.8、在 Acme.BookStore.Application.Contracts 层下创建 BookDto 类及CreateUpdateBookDto类型,并使用 AutoMapper 将 Book 实体转成 BookDto 对象,将CreateUpdateBookDto对象转成Book实体的映射

    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; }
        }
    
    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; }
        }

    在 Acme.BookStore.Application 层下的 BookStoreApplicationAutoMapperProfile 类中将 Book 实体转成 BookDto 对象

    namespace Acme.BookStore
    {
        public class BookStoreApplicationAutoMapperProfile : Profile
        {
            public BookStoreApplicationAutoMapperProfile()
            {
                /* You can configure your AutoMapper mapping configuration here.
                 * Alternatively, you can split your mapping configurations
                 * into multiple profile classes for a better organization. */
                CreateMap<Book, BookDto>();
                CreateMap<CreateUpdateBookDto, Book>();
            }
        }
    }

    3.9、创建 IBookAppService 接口 及它的实现类 BookAppService

    在 Acme.BookStore.Application.Contracts 项目下 添加 IBookAppService 接口

    namespace Acme.BookStore
    {
        public interface IBookAppService :
            ICrudAppService<//定义CRUD方法
                BookDto,//用来展示
                Guid,//主键类型
                PagedAndSortedResultRequestDto,//用于分页和排序
                CreateUpdateBookDto,//用于创建
                CreateUpdateBookDto//用于更新
                >
        {
    
        }
    }

    在 Acme.BookStore.Application 项目下添加 BookAppService 类

    namespace Acme.BookStore
    {
        public class BookAppService :
            CrudAppService<
                Book,
                BookDto,
                Guid,
                PagedAndSortedResultRequestDto,
                CreateUpdateBookDto,
                CreateUpdateBookDto>, IBookAppService
        {
            public BookAppService(IRepository<Book, Guid> repository)
                : base(repository)
            {
    
            }
        }
    }

    3.10、设置 Acme.BookStore.HttpApi.Host 为启动项目,并修改它的 appsettings.json 文件并运行

    3.10.1、设置 appsettings.json 设置方式同 3.7.4

    3.10.2 运行项目

     

    Abp VNext 入门——让ABP跑起来

     

    是不是非常奇怪,通常我们需要创建Controller以将应用程序服务公开为HTTP API端点。而ABP可以自动按照约定(惯例)将应用程序服务配置为MVC API控制器并使用 Swagger 来管理API文档。是不是很酷,我们没有编写任何代码来创建API控制器,但是现在我们有了一个可以正常使用的REST API!

    四、ABP分层

     

    Abp VNext 入门——让ABP跑起来

     

    4.1、Domain

    Domain(领域) 划分为两个项目,Domain.Share 和 Domain

    Domain.Share :包含常量,枚举和其他类型, 它不能包含实体,存储库,域服务或任何其他业务对象. 可以安全地与模块中的所有层使用. 此包也可以与第三方客户端使用.

    Domain: 包含实体, 仓储接口,领域服务接口及其实现和其他领域对象. Domain 包依赖于 Domain.Shared 包.

    4.2、Application

    Application(应用服务) 划分为两个项目 Application.Contracts 和 Application

    Application.Contracts:包含应用服务接口和相关的数据传输对象(DTO). Application contract 包依赖于 Domain.Shared 包

    Application:包含应用服务实现. Application 包依赖于 Domain 包和 Application.Contracts 包

    4.3、Infrastructure

    Infrastructure(基础设施) 为每个orm/数据库集成创建一个独立的集成包, 比如Entity Framework Core 和 MongoDB.

    4.4、HTTP

    • 为模块开发REST风格的HTTP API,
    • 为每个应用服务创建一个Controller (通常通过实现其接口). 这些控制器使用应用服务接口来委托操作. 它根据需要配置路由, HTTP方法和其他与Web相关的东西.
    • HTTP API 包只依赖于 Application.Contracts 包. 不要依赖 Application 包,
    • 创建一个为HTTP API包提供客户端服务的HTTP API Client包,这些客户端服务将应用服务接口实现远程端点的客户端.HTTP API Client 包仅依赖于 Application.Contracts 包 使用ABP框架提供的动态代理HTTP C#客户端的功能.

    4.5、Web

    包含页面,视图,脚本,样式,图像和其他UI组件,Web 包仅依赖于 HttpApi 包


    ABP框架遵循DDD原则和模式去实现分层应用程序模型,该模型由四个基本层组成:

    • 表示层: 为用户提供接口. 使用应用层实现与用户交互.
    • 应用层: 表示层与领域层的中介,编排业务对象执行特定的应用程序任务. 使用应用程序逻辑实现用例.
    • 领域层: 包含业务对象以及业务规则. 是应用程序的核心.
    • 基础设施层: 提供通用的技术功能,支持更高的层,主要使用第三方类库.
  • 相关阅读:
    异常:Unknown lifecycle phase "mvn". You must specify a valid lifecycle
    java中数的表示
    windows7 桌面突然卡住了,点击右键点不了,点击桌面软件点不了,怎么办?
    DJango错误日志生成
    drf框架接口文档
    drf框架中分页组件
    UVa10234 Race
    洛谷P2982 [USACO10FEB]慢下来Slowing down
    UVa10820 Send a Table
    POJ1861 Network
  • 原文地址:https://www.cnblogs.com/haoxiaozhang/p/14155963.html
Copyright © 2011-2022 走看看