EF Core + MySQL
完整 Web API 后端模板创建步骤。
跨域设置
- API 项目中创建 Extensions 文件夹,增加跨域扩展类:CrossPolicyExtension.cs
- 在启动类 Program.cs 中引入跨域扩展类:builder.Services.ConfigureCors();
- 在启动类 Program.cs 中使用跨域策略:app.UseCors("CorsPolicy");
创建实体
- 创建公共类库:Entity
- 创建实体类:Player、Character。(这两个类主要用于演示通过 C# 代码将实体映射到数据库表)
创建数据库映射
创建数据库映射的作用,是将实体类通过 C# 代码,创建到数据库中,省去了在数据库中建表的操作。如果不习惯,也可以直接在数据库中创建表。
- 创建公共类库:EntityFramework
-
在 EntityFramework 公共类库上安装两个包:
- EF Core:Microsoft.EntityFrameworkCore
- MySQL 数据库驱动:Pomelo.EntityFrameworkCore.MySql
-
在 EntityFramework 公共类库中创建 Mapping 文件夹,存放实体类与数据库的映射,里面设定了字段的长、索引、一对多等关系。
- 创建 PlayerMap 实体类
- 创建 CharacterMap 实体类
-
将实体映射类应用到 EF Core 中
仓储模式
- 创建 Contract 公共类库,在其中创建 IBaseRepository 接口。
- 在 EntityFramework 公共类库中创建 Repositories 文件夹,在其中创建 BaseReposity 实现类。
- 在 Contract 公共类库中,创建 IPlayerRepository 接口、ICharacterRepository 接口。
- 在 EntityFramework 公共类库的 Repositories 文件夹中创建 PlayerRepository 实现类、CharacterRepository 实现类。
仓储包装器
- 在 Contract 公共类库中,创建 IRepositoryWrapper 包装器接口。
- 在 EntityFramework 公共类库的 Repositories 文件夹中创建 RepositoryWrapper.cs 实现类。
-
在 API 项目的 Extensions 文件夹中,创建包装器扩展类 RepositoryWrapperExtension.cs,并在启动类 Program.cs 中引用:
builder.Services.ConfigureRepositoryWrapper();
控制器
- 在 API 项目的 Controllers 文件夹中,创建 PlayerController 控制器。
数据传输对象
- 在 Entity 公共类库中,创建 Dtos 文件夹。
- 在 Dtos 文件夹中创建 PlayerDto.cs 类。
- 在 API 项目中安装 AutoMapper 包,用于实体和传输对象之间的自动映射。
- 在 API 项目中创建映射配置类:MappingProfile.cs,写入映射关系。
- 在 PlayerController 控制器的构造函数中,注入映射器。
- PlayerController 中的 GetById 方法,将查询到的实体转换成 PlayerDto。
- 另外还有 PlayerForCreationDto.cs、PlayerForUpdateDto.cs、CharacterDto.cs、PlayerWithCharactersDto.cs,使用步骤与上面的一样。
分页
- 在 Entity 公共类库中,添加请求特征文件夹 RequestFeature,在里面创建抽象类 QueryStringParameters,保存各实体类通用的查询条件。
- 创建 PlayerParameter 类,继承 QueryStringParameters 抽象类。
- 修改 PlayerController 中的查询方法,将 PlayerParameter 作为参数传入。
- 在 Entity 公共类库中,创建影响类型文件夹 ResponseType,在里面创建 Paging 文件夹,在里面创建 PageMetaData.cs、PageList.cs、PageExtensions.cs
- 修改 PlayerController 控制器中的查询方法,增加分页步骤。
筛选封装
- 对筛选条件进行封装:在 EntityFramework 公共类库——Repositories 文件夹中创建 Extensions 文件夹,在 Extensions 文件夹中创建仓储的扩展类,比如权限仓储的扩展类 TAthorityRepositoryExtension.cs
-
在仓储中引用扩展类中的封装方法,比如在权限仓储 TAuthorityRepository 中有:
.SearchByName(authorityParameter.name)
- 如果还有其他筛选条件,可以继续在 TAthorityRepositoryExtension.cs 中封装方法。
排序
- 在 Entity 公共类库——RequestFeature 文件夹——QueryStringParameters.cs 类中,增加 orderBy 字段。
- 想要通过传入的字段进行排序,先在 EntityFramework 公共类库中,安装 System.Linq.Dynamic.Core 包,提供动态生成 Linq 表达式的功能。
- 在 EntityFramework 公共类库——Repositories 文件夹——Extensions 文件夹内,创建 RepositoryExtension.cs 仓储扩展类,其中的 OrderByQuery<T> 方法可以按照传入的字段进行排序,比如传入 code desc,name,create_time desc
-
在仓储中使用 排序,比如在权限仓储 TAuthorityRepository 中:
.OrderByQuery(authorityParameter.orderBy)
数据构型
- 数据构型可以节省返回给前端内容的流量,根据传给后端的查询字符串选择字段,塑造想要的数据结构。
- 在 Entity 公共类库——RequestFeature 文件夹——QueryStringParameters.cs 类中,增加 fields 字段。
- 在 Entity 公共类库——ResponseType 文件夹下,创建 DataSharping 文件夹,里面创建 DataSharper.cs 和 DataShapeExtensions.cs。
-
在控制器中使用数据构型,比如在权限控制器 TAuthorityController 中:
.ShapeData(authorityParameter.fields);