使用ASP.NET Core 3.x 构建 RESTful API P11 P12 ActionResult of T以及 AutoMapper.md

亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述使用ASP.NET Core 3.x 构建 RESTful API P11 P12 ActionResult of T以及 AutoMapper.md相关的知识,希望能为你提供帮助。
使用ASP.NET Core 3.x 构建 RESTful API P11 P12 ActionResult of T以及 AutoMapperAutoMapper对象映射博客园文章Id:12665843

    • IActionResult
    • 对象映射器 AutoMapper

IActionResult实际上针对IActionResult接口有一个实现类,ActionResult< T> 所以一般当我们知道明确的返回类型时,我们也应该明确定义Action方法的返回值类型,示例代码如下:
/// < summary> /// 获取所有公司信息 /// < /summary> [HttpGet] //public async Task< IActionResult> GetCompanies() public async Task< ActionResult< IEnumerable< CompanyDto> > > GetCompanies() { var companies = await this._companyRepository.GetCompaniesAsync(); if (companies == null) { return NotFound(); // 404 NotFound }//return Ok(companies); var companyDtos = new List< CompanyDto> (); foreach (var item in companies) { companyDtos.Add(new CompanyDto { Id = item.Id, Name = item.Name }); }return Ok(companyDtos); }

这样做的好处是,我们可以将返回的资源,具体的类型明确化,它的好处体现在,比如当我们使用Swagger插件来生成接口文档时,就可以明确的知道返回值类型了.
以上面代码为例,接口方法返回的结果类型实际上可以有以下几种形式:
  1. 当申明的返回值类型为: Task< ActionResult< IEnumerable< CompanyDto> > > 那么返回值类型可以写成return companyDtos,也可以写成 return Ok(companyDtos);
  2. 当声明的返回值类型为: 在Task中直接是返回值类型 如:Task< IEnumerable< CompanyDto> > 那么返回值类型就应该返回具体的类型 return companyDtos ;
  3. 当声明的返回值类型为: 在Task中的类型为 IActionResult 那么具体的返回值,可以写成 return Ok(companyDtos) 这种形式.
综上所述,我们应该尽可能的使用第一种写法.
对象映射器 AutoMapper在 .Net 的生态中,AutoMapper 是比较丰富的对象映射器,它提供了丰富的配置方法,方便开发者对两个对象之间配置映射关系.
  1. 首先我们需要先通过Nuget来安装AutoMapper的依赖项.

使用ASP.NET Core 3.x 构建 RESTful API P11 P12 ActionResult of T以及 AutoMapper.md

文章图片

通过NuGet安装 AutoMapper依赖
AutoMapper.Extensions.Microsoft.DependencyInjection可以更好的和 .Net Core的管道进行结合.
A convention-based object-object mapper基于约定的对象到对象的映射器
  1. 然后我们需要在 .Net Core容器配置的方法中,注册AutoMapper服务.
/* * 在容器配置方法中,添加AutoMapper服务, * 参数的意义上,在指定程序集中扫描 AutoMapper 的配置文件. */ services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

  1. 在项目下添加Profiles文件夹,此文件夹中用于装载AutoMapper映射关系的配置.
配置代码:
using AutoMapper; using Routine.Api.Entitle; using Routine.Api.Models; namespace Routine.Api.Profiles { public class CompanyProfile : Profile { /// < summary> /// 需要在构造函数中配置映射关系 /// < /summary> public CompanyProfile() { /* * 创建从Company(原对象),到CompanyDto(目标对象)的映射 */ CreateMap< Company, CompanyDto> () .ForMember( dest=> dest.CompanyName,//目标属性 opt=> opt.MapFrom(src=https://www.songbingjia.com/android/> src.Name) //表示配置目标属性的映射源即从Company中的name映射到CompanyDto中的CompanyName ); } } }

【使用ASP.NET Core 3.x 构建 RESTful API P11 P12 ActionResult of T以及 AutoMapper.md】AutoMapper的一些要点:
  • AutoMapper是基于约定的,如果原对象,和目标对象中的属性名称是相同的,那么AutoMapper会自动进行映射.
  • 如果目标类型的某个属性在源类型中没有,那么就会自动会被忽略,不会被赋值,即为null.
  • 针对自动映射没有办法成功的属性,AutoMapper会提供一系列可以配置的方法,用于指定属性间的映射关系.
  1. 使用AutoMapper 来组织映射,如果要使用AutoMapper来组织映射,我们需要在控制器的构造函数中,配置注入.
private readonly ICompanyRepository _companyRepository; private readonly IMapper _mapper; public CompaniesController(ICompanyRepository companyRepository,IMapper mapper) { _companyRepository = companyRepository ?? throw new ArgumentNullException(nameof(companyRepository)); _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); }

  1. 使用AutoMapper的代码如下:
/// < summary> /// 获取所有公司信息 /// < /summary> [HttpGet] //public async Task< IActionResult> GetCompanies() public async Task< ActionResult< IEnumerable< CompanyDto> > > GetCompanies() { var companies = await this._companyRepository.GetCompaniesAsync(); if (companies == null) { return NotFound(); // 404 NotFound }//return Ok(companies); //自己指定映射关系 //var companyDtos = new List< CompanyDto> (); //foreach (var item in companies) //{ //companyDtos.Add(new CompanyDto //{ //Id = item.Id, //CompanyName = item.Name //}); //} //return Ok(companyDtos); //使用AutoMapper的映射关系//T是目标类型, 参数中是源类型 var result = this._mapper.Map< IEnumerable< CompanyDto> > (companies); return Ok(result); }

  • 以上文档参考自:
    IActionResult
    AutoMapper

    推荐阅读