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


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


    博客园文章Id:12665843


    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的依赖项.

    通过NuGet安装 AutoMapper依赖
    通过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=>src.Name) //表示配置目标属性的映射源  即从Company中的name映射到CompanyDto中的CompanyName
                        );
            }
        }
    }

    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);
     }
  • 相关阅读:
    C语言memmove()函数:复制内存内容(可以处理重叠的内存块)
    boot简介
    MT6753/MT6755 呼吸灯功能添加
    MT6753 使用nt35596s 由于液晶极化出现的闪屏问题解决思路
    MTK平台释疑android M 配置中断相关问题
    MT6755 平台手机皮套驱动实现
    MTK平台 GPU 相关知识
    MTK平台如何定位显示花屏和界面错乱等绘制异常的问题?
    【Python】注释
    【Linux】.gz文件 压缩与解压缩命令
  • 原文地址:https://www.cnblogs.com/HelloZyjS/p/12665843.html
Copyright © 2020-2023  润新知