亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述使用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插件来生成接口文档时,就可以明确的知道返回值类型了.
以上面代码为例,接口方法返回的结果类型实际上可以有以下几种形式:
- 当申明的返回值类型为:
Task< ActionResult< IEnumerable< CompanyDto> > >
那么返回值类型可以写成return companyDtos
,也可以写成return Ok(companyDtos)
;
- 当声明的返回值类型为: 在Task中直接是返回值类型 如:
Task< IEnumerable< CompanyDto> >
那么返回值类型就应该返回具体的类型return companyDtos
;
- 当声明的返回值类型为: 在Task中的类型为
IActionResult
那么具体的返回值,可以写成return Ok(companyDtos)
这种形式.
对象映射器 AutoMapper在 .Net 的生态中,AutoMapper 是比较丰富的对象映射器,它提供了丰富的配置方法,方便开发者对两个对象之间配置映射关系.
- 首先我们需要先通过Nuget来安装AutoMapper的依赖项.
文章图片
通过NuGet安装 AutoMapper依赖
AutoMapper.Extensions.Microsoft.DependencyInjection可以更好的和 .Net Core的管道进行结合.
A convention-based object-object mapper
基于约定的对象到对象的映射器- 然后我们需要在 .Net Core容器配置的方法中,注册AutoMapper服务.
/*
* 在容器配置方法中,添加AutoMapper服务,
* 参数的意义上,在指定程序集中扫描 AutoMapper 的配置文件.
*/
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
- 在项目下添加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会提供一系列可以配置的方法,用于指定属性间的映射关系.
- 使用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));
}
- 使用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
推荐阅读
- Android | 教你如何用代码一键实现银行卡绑定
- react-native使用react-native run-android 启动项目报错Android project not found
- 结对项目介绍——“益青春APP”
- matplotlib TransformWrapper
- Appium自动化 - 设置unicodeKeyboard: True运行脚本后,手机输入时无法调出软键盘
- 2020/4/10安卓开发(Spinner下拉框)
- ionic app 热更新
- 阿里大牛又一波骚操作,安卓UI开发新技能-Jetpack Compose,绝了
- 移动APP设备锁功能开发中的问题