ABPvNext框架后台学习笔记


ABPvNext框架官网

ABP vNext框架官网https://abp.io/
图:ABPvNext框架官网

创建实体

Domain层创建Book类
图:Domain层创建Book类
实体继承AuditedAggregateRoot,则在操作该表时,别人无法操作。带有锁
实体继承FullAuditedAggregateRoot,则在AuditedAggregateRoot基础上多了一个软删除
还有一种是继承AuditedEntity,这是普通的情况

注:价格一般是用Decimal类型,这边学习暂时用float
图:价格用Decimal

using System;
using Volo.Abp.Domain.Entities.Auditing;

namespace Acme.BookStore
{
    public class Book:FullAuditedAggregateRoot
    {
        public string Name { get; set; }
        public BookType Type { get; set; }
        public DateTime PublishDate { get; set; }
        public float Price { get; set; }

        protected Book()
        {

        }

        public Book(Guid id, string name, BookType type, DateTime publishDate, float price) : base(id)
        {
            Id=id;
            Name = name;
            Type = type;
            PublishDate = publishDate;
            Price = price;
        }
    }



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

注册实体

先将实体信息注册到EntityFrameworkCore层的DbContext中
图:实体信息注册到EntityFrameworkCore层的DbContext
随后配置注册实体
图:配置注册实体

builder.Entity(b =>
{
    b.ToTable(BookStoreConsts.DbTablePrefix + "Book", BookStoreConsts.DbSchema);
    b.ConfigureByConvention(); //auto configure for the base class props
    b.Property(x=>x.Name).IsRequired().HasMaxLength(BookStoreConsts.HasMaxLength);
});

有可能会调用Domain层的BookStoreConsts.cs中自定义的常量
图:Domain层的BookStoreConsts.cs中自定义的常量

修改数据库连接字符串并执行命令生成建表代码

修改相应层的数据库连接
1、IdentityServer层修改appsettings.json文件的数据库连接字符串
2、EntityFrameworkCore.DbMigrations层修改appsettings.json文件(没有则新建json文件)的数据库连接字符串
3、HttpApi.Host层修改appsettings.json文件的数据库连接字符串
4、DbMigrator层修改appsettings.json文件的数据库连接字符串

"ConnectionStrings": {
  "Default": "data source=192.168.xx.xx;initial catalog=BookStore;user id=sa;password=xxxxxx"
},

随后,执行命令生成建表代码。(在CMD命令行 或 Rider的Terminal执行命令)
3.x版本的.net core在命令行中执行,以使用dotnet ef命令

dotnet tool install --global dotnet-ef

图:安装dotnet-ef命令

打开命令行并进入EntityFrameworkCore.DbMigrations层的路径,随后执行下面语句

cd C:\asp_workspace\BookStore\src\Acme.BookStore.EntityFrameworkCore.DbMigrations

图:进入EntityFrameworkCore.DbMigrations层

dotnet add package Microsoft.EntityFrameworkCore.Design

图:添加Design包

dotnet ef migrations add “created_book_entity” 

图:生成migrations

可以看到EntityFrameworkCore.DbMigrations层的Migrations文件夹中新生成了一个文件
图:Migrations文件夹中新生成的文件

运行DbMigrator以生成数据库和表

图:生成数据库和表1
图:生成数据库和表2

=============================⬇⬇⬇可能会出现的问题⬇⬇⬇=========================
如果出现版本不一致错误,到相应的csproj解决方案中去掉类似下方的代码,重新运行即可
图:生成数据库和表3
图:生成数据库和表4
解决方案如下:
图:生成数据库和表5
图:生成数据库和表6
=============================⬆⬆⬆可能会出现的问题⬆⬆⬆=========================

Application.Contracts层建立对应实体的DTO,设置实体数据到DTO及操作DTO的转换

因为是严格分层,这边要使用BookType类型,只会引用Domain.Shared层的实体。所以将上方的BookType单独抽成一个类,放到Domain.Shared层中
图:BookType类型抽取放到Domain.Shared公共实体层

随后Application.Contracts层写实体的DTO
这边DTO可以继承AuditedEntityDto,也可以继承EntityDto
图:Application.Contracts层写实体的DTO

再在里面写创建更新操作的DTO,可以做字段长度、是否必填等的限制
图:实体的创建更新操作的DTO

设置实体数据到DTO以及操作DTO的转换
Book数据转到BookDto(用于查询)
CreateUpdateBookDto数据转到Book(用于创建创建和更新)
相当于Book实体是和数据库打交道的底层实体

图:设置实体数据到DTO以及操作DTO的转换
如果要反向转,直接再后面加一个.ReverseMap()

//从BookDto反向转成Book
CreateMap().ReverseMap();

写CRUD接口及实现

Application.Contracts层写接口
图:Application.Contracts层写接口
Application层写对应接口的实现
图:Application层写对应接口的实现

运行HttpApi.Host层(Swagger展示API接口)

=============================⬇⬇⬇可能会出现的问题⬇⬇⬇=========================
运行之前,如果单独安装Rider的,可能需要安装下IIS
图:单独安装Rider的,可能需要安装下IIS
点击上方链接后会进入微软官网下载,根据自己的操作系统下载对应版本,运行安装即可
这边操作系统是64位的,下载amd64的中文版
图:IIS的amd64的中文版
=============================⬆⬆⬆可能会出现的问题⬆⬆⬆=========================

随后,运行HttpApi.Host即可进入swagger展示API接口界面
注:要选择后面不带“IIS Express”的运行

图:运行HttpApi.Host后面不带IISExpress字样
图:swagger接口图

注:上述url是https开头的地址,Rider可能会提示需要安装SSL信任证书。安装一下即可

接口测试

测试新增,点击“POST”接口
图:接口测试1
图:接口测试2
修改相应的值,然后“Execute”执行一下。出现状态值是200即表示执行成功
图:Execute执行POST接口1
图:Execute执行POST接口2
最后看下数据库。有数据插入
注:除了实体的属性外,其他字段都是通过继承过来产生的。如创建人,创建时间,最后修改人等

图:执行POST接口后的数据插入

测试更新,点击“PUT”接口
拿到上述的id,然后和上述类似,填入id,修改相应值,执行下即可
图:测试PUT接口
执行结果如下
图:执行PUT接口的结果

如何修改API名称及请求地址路径呢?
修改好后,重启HttpApi.Host层
注:Book2AppService名称后面的AppService要保留,前缀随便改

图:修改API名称及请求地址路径1
图:修改API名称及请求地址路径结果1

修改/api后面的RootPath,自己写东西的RootPath就都变成这个。推荐方式3
方式1:

Configure(options =>
{
    options.MinifyGeneratedScript = true;
    options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly,
        opts => { opts.RootPath = "MyBook";});
});

图:修改RootPath方式1

方式2:

Configure(options =>
{
    options.MinifyGeneratedScript = true;
    options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly,
        opts => { opts.RootPath = "MyBook";});
});

图:修改RootPath方式2

方式3:推荐

//options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly);

options.MinifyGeneratedScript = true;
options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly,
    opts => { opts.RootPath = "MyBook";});

图:修改RootPath方式3

运行Web层

HttpApi.Host层启动状态,然后再启动Web层调用后台接口。
图:运行Web层
启动时间较长,需要等待
图:运行Web层结果

部署项目到IIS服务器

服务器上安装.net core运行环境,hosting和runtime的安装包。这边都是下载的x64版本的
https://dotnet.microsoft.com/download/dotnet-core/3.1
图:安装服务器netcore运行环境
图:下载的netcore运行环境
注:服务器中安装好上面两个运行环境,需要重启服务器

mstsc远程进入服务器,打开IIS管理界面,点击左边的服务器,右边点击“模块”
图:查看netcore安装结果1
出现“AspNetCoreModuleV2”就说明前面的环境安装成功
图:查看netcore安装结果2

随后,编译项目。这边结合前端框架Vue一起来部署。一定要先部署后台接口项目
选择“Release”方式,项目选择不带“IIS Express”的
图:选择项目
先点击Host项目,clean一下解决方案
图:清理一下Host解决方案
再Rebuild一下解决方案
图:Rebuild一下解决方案
进入到类似于下方的文件夹中,把所有文件压缩打包放到服务器上
……\Xhznl.HelloAbp.HttpApi.Host\bin\Release\netcoreapp3.1
图:压缩编译后的代码
服务器的IIS中添加网站
图:服务器的IIS中添加网站
图:设置名称和网站端口
随后在IIS的应用程序池中,右击项目,找到“基本设置”,改成“无托管代码”
图:网站改成无托管代码1
图:网站改成无托管代码2

然后再部署前端

================================资料===============================
1、TestProject.Host.Shared ,这个项目其实没多大用的到。看到Shared基本也能想到了。就是一些公用的配置之类的。比如他官方在这里做了个是否启用租户模式的配置。
2、TestProject.HttpApi.Host,这个比较重要,这是当前模块(我这个模块名字叫TestProject)的 主机宿主,里边各种模块相关的配置,运行起来这个,才能访问模块提供的api。
3、TestProject.IdentityServer,这是AuthServer,用的identityserver4,用户的授权全靠它了。这个服务在整个项目存在一个就行了,如果多模块,比如我又创建了个TestProject2,那么TestProject 和TestProject2 是共用 这个AuthServer 的。
4、TestProject.Web.Host 实际开发基本用不大到,这个官方给的一个例子,演示了客户端如何使用identityserver4进行登录
5、TestProject.Web.Unified 目前还没用到,也不知道有什么用,不说了这个
然后看下src项目
1、TestProject.Application ,相当于service层,abp框架可以做到把这层直接转为api,就不用写controller层代码了。具体如何转的后边会讲到。
2、TestProject.Application.Contracts 这层主要放Dto(数据传输对象)和权限的一些配置。
3、TestProject.Domain ,领域层,领域模型开发不了解的可以去找些资料看一下。如果用贫血模型,这层就类似之前的的Model层。
4、TestProject.Domain.Shared,看到Shared了,那么就知道是啥了,公用配置。官网这里给了多语言相关的配置
5、TestProject.EntityFrameworkCore 这个我就不用说了吧
6、TestProject.HttpApi 传统意义的Controller层,这里abp让它失业了。
其他几个目前没用到,估计也没啥用。
apb的主要结构就是这些,了解了这些,入门相当于是抬起了一个脚了。
================================资料===============================


文章作者: Zavir
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Zavir !
  目录