|
主题设置

卡片式面板通常用于非白色背景色的主体内

EF Core + MySQL

完整 Web API 后端模板创建步骤。

跨域设置

  1. API 项目中创建 Extensions 文件夹,增加跨域扩展类:CrossPolicyExtension.cs
  2. 在启动类 Program.cs 中引入跨域扩展类:builder.Services.ConfigureCors();
  3. 在启动类 Program.cs 中使用跨域策略:app.UseCors("CorsPolicy");

创建实体

  1. 创建公共类库:Entity
  2. 创建实体类:Player、Character。(这两个类主要用于演示通过 C# 代码将实体映射到数据库表)

创建数据库映射

创建数据库映射的作用,是将实体类通过 C# 代码,创建到数据库中,省去了在数据库中建表的操作。如果不习惯,也可以直接在数据库中创建表。

  1. 创建公共类库:EntityFramework
  2. 在 EntityFramework 公共类库上安装两个包:
    • EF Core:Microsoft.EntityFrameworkCore
    • MySQL 数据库驱动:Pomelo.EntityFrameworkCore.MySql
  3. 在 EntityFramework 公共类库中创建 Mapping 文件夹,存放实体类与数据库的映射,里面设定了字段的长、索引、一对多等关系。
    • 创建 PlayerMap 实体类
    • 创建 CharacterMap 实体类
  4. 将实体映射类应用到 EF Core 中
    • 配置数据库上下文,在 EntityFramework 公共类库中创建 WmsDbContext.cs 类。
    • 准备要映射到数据库的数据,创建 DataInitialize.cs 类。(里面是 Player 和 Character 要插入的数据库里的数据)
    • 在数据库上下文 WmsDbContext 中引用 DataInitialize.cs 类。
      // 用 DataInitialize 类里的数据插入数据库
      modelBuilder.Entity().HasData(DataInitialize.players);
      modelBuilder.Entity().HasData(DataInitialize.characters);
    • 在 appsettings.json 中配置数据库连接字符串。
    • 创建数据库扩展类,在 Extensions 文件夹中新建 MysqlExtension.cs
    • 在启动类 Program.cs 中引用数据库引入数据库扩展类。
    • 在 API 项目中安装迁移工具:Microsoft.EntityFrameworkCore.Tools
    • 在 API 项目的 “程序包管理控制台” 中执行创建迁移命令:
      • “程序包源” 选择 “全部”,“默认项目” 选择 “EntityFramework”:
        Add-Migration IntialCreated
      • 创建完成以后,在 EntityFramework 中会生成 Migrations 文件夹,里面有 20240915092558_IntialCreated.cs 和 WmsDbContextModelSnapshot.cs 两个类。
      • 将创建的迁移更新到数据库,继续执行更新到数据库的命令,执行完成后数据库中的表就创建成功了:
        Update-Database

仓储模式

  1. 创建 Contract 公共类库,在其中创建 IBaseRepository 接口。
  2. 在 EntityFramework 公共类库中创建 Repositories 文件夹,在其中创建 BaseReposity 实现类。
  3. 在 Contract 公共类库中,创建 IPlayerRepository 接口、ICharacterRepository 接口。
  4. 在 EntityFramework 公共类库的 Repositories 文件夹中创建 PlayerRepository 实现类、CharacterRepository 实现类。

仓储包装器

  1. 在 Contract 公共类库中,创建 IRepositoryWrapper 包装器接口。
  2. 在 EntityFramework 公共类库的 Repositories 文件夹中创建 RepositoryWrapper.cs 实现类。
  3. 在 API 项目的 Extensions 文件夹中,创建包装器扩展类 RepositoryWrapperExtension.cs,并在启动类 Program.cs 中引用:
    builder.Services.ConfigureRepositoryWrapper();

控制器

  1. 在 API 项目的 Controllers 文件夹中,创建 PlayerController 控制器。

数据传输对象

  1. 在 Entity 公共类库中,创建 Dtos 文件夹。
  2. 在 Dtos 文件夹中创建 PlayerDto.cs 类。
  3. 在 API 项目中安装 AutoMapper 包,用于实体和传输对象之间的自动映射。
  4. 在 API 项目中创建映射配置类:MappingProfile.cs,写入映射关系。
  5. 在 PlayerController 控制器的构造函数中,注入映射器。
  6. PlayerController 中的 GetById 方法,将查询到的实体转换成 PlayerDto。
  7. 另外还有 PlayerForCreationDto.cs、PlayerForUpdateDto.cs、CharacterDto.cs、PlayerWithCharactersDto.cs,使用步骤与上面的一样。

分页

  1. 在 Entity 公共类库中,添加请求特征文件夹 RequestFeature,在里面创建抽象类 QueryStringParameters,保存各实体类通用的查询条件。
  2. 创建 PlayerParameter 类,继承 QueryStringParameters 抽象类。
  3. 修改 PlayerController 中的查询方法,将 PlayerParameter 作为参数传入。
  4. 在 Entity 公共类库中,创建影响类型文件夹 ResponseType,在里面创建 Paging 文件夹,在里面创建 PageMetaData.cs、PageList.cs、PageExtensions.cs
  5. 修改 PlayerController 控制器中的查询方法,增加分页步骤。

筛选封装

  1. 对筛选条件进行封装:在 EntityFramework 公共类库——Repositories 文件夹中创建 Extensions 文件夹,在 Extensions 文件夹中创建仓储的扩展类,比如权限仓储的扩展类 TAthorityRepositoryExtension.cs
  2. 在仓储中引用扩展类中的封装方法,比如在权限仓储 TAuthorityRepository 中有:
    .SearchByName(authorityParameter.name)
  3. 如果还有其他筛选条件,可以继续在 TAthorityRepositoryExtension.cs 中封装方法。

排序

  1. 在 Entity 公共类库——RequestFeature 文件夹——QueryStringParameters.cs 类中,增加 orderBy 字段。
  2. 想要通过传入的字段进行排序,先在 EntityFramework 公共类库中,安装 System.Linq.Dynamic.Core 包,提供动态生成 Linq 表达式的功能。
  3. 在 EntityFramework 公共类库——Repositories 文件夹——Extensions 文件夹内,创建 RepositoryExtension.cs 仓储扩展类,其中的 OrderByQuery<T> 方法可以按照传入的字段进行排序,比如传入 code desc,name,create_time desc
  4. 在仓储中使用 排序,比如在权限仓储 TAuthorityRepository 中:
    .OrderByQuery(authorityParameter.orderBy)

数据构型

  1. 数据构型可以节省返回给前端内容的流量,根据传给后端的查询字符串选择字段,塑造想要的数据结构。
  2. 在 Entity 公共类库——RequestFeature 文件夹——QueryStringParameters.cs 类中,增加 fields 字段。
  3. 在 Entity 公共类库——ResponseType 文件夹下,创建 DataSharping 文件夹,里面创建 DataSharper.cs 和 DataShapeExtensions.cs。
  4. 在控制器中使用数据构型,比如在权限控制器 TAuthorityController 中:
    .ShapeData(authorityParameter.fields);