使用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

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

通过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);
 }

原文地址:https://www.cnblogs.com/HelloZyjS/p/12665843.html

时间: 2024-11-04 22:13:55

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

使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作

使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作 学习记录.Net CoreWeb Api RESTful API Web API 简介: web API通常是指"使用HTTP协议并通过网络调用的API",由于它使用了HTTP协议,所以需要通过URL信息来指定端点. API 是 Application Programming Intrface 的缩写,是软件的外部接口. 也就是说,针对某个软件,人们可以知道它的外部功能,但并不知道(也不需要知道)它内

使用ASP.NET Core 3.x 构建 RESTful API P6 状态和路由

使用ASP.NET Core 3.x 构建 RESTful API P6 状态和路由 HTTP状态路由 在 .Net Core Web API 项目中,Controller 层是对外层,所以在 Controller 层之下的其它层(如:业务逻辑层,数据库访问层)是如何运作的,与 Controller层无关,所以针对业务结果,在 Controller 层对外表述的时候,我们需要根据也业务结果给出,具体的 HTTP 状态码. 分析一个 Action 方法,此 Action 存在于 Companies

使用ASP.NET Core 3.x 构建 RESTful API - 3.4 内容协商

现在,当谈论起 RESTful Web API 的时候,人们总会想到 JSON.但是实际上,JSON 和 RESTful API 没有半毛钱关系,只不过 JSON 恰好是RESTful API 结果的表述格式.也就是说 RESTful API 还可以使用其它的表述格式,例如 xml 或私有的格式.这也就意味着,我们需要让 RESTful API 知道我们想要返回的格式.而这就是HTTP请求和响应的核心内容之一: Content Negotiation 内容协商 内容协商是这样一个过程:针对一个响

ASP.NET Core 入门教程 2、使用ASP.NET Core MVC框架构建Web应用

原文:ASP.NET Core 入门教程 2.使用ASP.NET Core MVC框架构建Web应用 一.前言 1.本文主要内容 使用dotnet cli创建基于解决方案(sln+csproj)的项目 使用Visual Studio Code开发基于解决方案(sln+csproj)的项目 Visual Studio Code Solution插件( vscode-solution-explorer)基础使用介绍 基于 .NET Core web项目模板构建 ASP.NET Core MVC We

ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者的心情.或者详细点,或者简单点.那么有没有一种快速有效的方法来构建api说明文档呢?答案是肯定的, Swagger就是最受欢迎的REST APIs文档生成工具之一! 为什么使用Swagger作为REST APIs文档生成工具 Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学

ASP.NET Core WebApi使用Swagger生成api

引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者的心情.或者详细点,或者简单点.那么有没有一种快速有效的方法来构建api说明文档呢?答案是肯定的, Swagger就是最受欢迎的REST APIs文档生成工具之一! 为什么使用Swagger作为REST APIs文档生成工具 Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学

Spring MVC中使用 Swagger2 构建Restful API

1.maven依赖 <!-- 构建Restful API --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>io.spr

springboot集成swagger2构建RESTful API文档

在开发过程中,有时候我们需要不停的测试接口,自测,或者交由测试测试接口,我们需要构建一个文档,都是单独写,太麻烦了,现在使用springboot集成swagger2来构建RESTful API文档,可以在访问接口上,直接添加注释 先介绍一下开发环境: jdk版本是1.8 springboot的版本是1.4.1 开发工具为 intellij idea 我们先引入swagger2的jar包,pom文件引入依赖如下: <dependency> <groupId>io.springfox&

spring boot 1.5.4 集成Swagger2构建Restful API(十八)

上一篇博客地址:springboot 1.5.4 整合rabbitMQ(十七) 1      Spring Boot集成Swagger2构建RESTful API文档 1.1  Swagger2简介 Swagger2官网:http://swagger.io/ 由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会