jk's notes
  • ch06 验证与映射小结

ch06 验证与映射小结

本章介绍数据校验和 AutoMapper 的使用.

Minimal API 中没有 内置的 基于注解的类型校验. 作为替代方案, 有两个库可以使用:

  • MiniValidation
  • FluentValidation

测试后发现:

  • 基于控制器 API, 如果传入对象类型不符合要求. 直接不会进入端点处理函数. 如何不符合类型注解的约束也不会进入端点处理函数.
  • Minimal API, 即使只传入空对象 {} 也会进入端点处理函数.

实际开发中, 不会将实体类型直接返回给客户端.

  • 一方面为了保护底层数据结构.
  • 另一方面, 存在一个映射层, 在后台数据结构发生变化的时候, 前端不用进行修改.

常用的库为 AutoMapper.

MiniValidation

MiniValidation 依旧依赖于类型注解.

安装包:

dotnet add package MiniValidation --version 0.9.0

使用方法:

  1. 按照类型注解为类型属性提交校验约束.

  2. Minimal API 总会进入端点函数. 使用方法:

    bool isValid = MiniValidator.TryValidate(对象, out var errors);
    if (!isValid) {
      return Results.ValidationProblem(errors);
    }
    

Nuget: https://www.nuget.org/packages/MiniValidation

新的包提供了 ASP.NET Core 的扩展:

dotnet add package MinimalApis.Extensions

减少了自行判断的过程, 使用该扩展得到的效果与控制器中, 进行校验的效果一样: 不会进入端点处理函数. 使用步骤:

  1. 安装包

  2. 区别 .NET 6 和 .NET 7+ 的版本. 6 中需要调用

    builder.Services.AddEndpointsMetadataProviderApiExplorer()
    

    如果是7+ 的版本, 则不用变化.

  3. 如果是 .NET 6 则使用 Validated<T> 来封装参数, 如果是 .NET7+ 则在 Map 系列方法后再调用 WithParameterValidation 方法即可.

类库依旧在变化中, 使用方法也在变化.

NUGET: https://www.nuget.org/packages/MinimalApis.Extensions

FluentValidation

使用 MiniValidation 验证与模型强耦合, 使用 FluentValidation 可以将模型与验证解耦.

AutoMapper

进行实体模型到返回给客户端对象的映射, 一般:

  • 自定义映射过程, 会比较麻烦, 需要一个个自行编写
  • 使用 AutoMapper 来自动处理映射

安装依赖包: dotnet add package AutoMapper --version 12.0.1

或 ASP.NET Core 依赖包: dotnet add package AutoMapper.Extensions.Microsoft.DependencyInjection

文档地址: https://docs.automapper.org/en/stable/

基本使用步骤:

  1. 安装包.

  2. 从 Profile 类派生, 在构造函数中创建映射, 并定义类型与类型的转换规则 (如果有必要).

    CreateMap<TSource, TDestination>
    

    如果需要反向映射使用 ReverseMap() 方法. 如果需要投影, 则使用 ForMember 与 MapFrom 方法.

  3. 注册服务, 告诉 AutoMapper 需要处理的程序集.

    build.Services.AddAutoMapper(typeof(Program).Assembly);
    

    也可以手动添加 Type 类型的数据 (Profile 派生类), 或多个程序集.

  4. 使用 IMapper 进行依赖注入.

    mapper.Map<T>(obj);
    

使用应注意性能的问题 (内部支持递归属性, 并使用了反射).

Last Updated:
Contributors: jk