使用ASP.NET Core 3.x 构建 RESTful API P13 P14 获取父子关系的资源
使用ASP.NET Core 3.x 构建 RESTful API P13 P14 获取父子关系的资源
博客园文章id:12674187
父子关系的数据在API中的表现(第一种)情况
举例: 一个公司一般有多个员工,即一对多关系,那么我们怎么通过API来表现这种关系呢?
对外模型Dto的编写
using System;
namespace Routine.Api.Models
{
public class EmployeeDto
{
public Guid Id { get; set; }
public Guid CompanyId { get; set; }
public string EmployeeNo { get; set; }
public string Name { get; set; }
public string GenderDisplay { get; set; }
public int Age { get; set; }
}
}
AutoMapper对象映射关系
using System;
using AutoMapper;
using Routine.Api.Entitle;
using Routine.Api.Models;
namespace Routine.Api.Profiles
{
/// <summary>
/// 配置 Employee 和 EmployeeDto 对象间的映射关系
/// </summary>
public class EmployeeProfile:Profile
{
public EmployeeProfile()
{
CreateMap<Employee, EmployeeDto>()
.ForMember(
dest => dest.Name,
opt=>opt.MapFrom(src=>$"{src.FirstName} {src.LastName}")) //姓名
.ForMember(
dest=>dest.GenderDisplay,
opt=>opt.MapFrom(src=>src.Gender.ToString())) //性别
.ForMember(
dest=>dest.Age,
opt=>opt.MapFrom(src=>DateTime.Now.Year - src.DateOfBirth.Year)) //年龄
;
}
}
}
API的编写
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using Routine.Api.Entitle;
using Routine.Api.Models;
using Routine.Api.Services;
namespace Routine.Api.Controllers
{
[ApiController]
[Route("api/companies/{companyId}/employees")]
public class EmployeesController:ControllerBase
{
private readonly IMapper _mapper;
private readonly ICompanyRepository _companyRepository;
public EmployeesController(IMapper mapper,ICompanyRepository companyRepository)
{
_mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
_companyRepository = companyRepository ?? throw new ArgumentNullException(nameof(companyRepository));
}
[HttpGet]
public async Task<ActionResult<IEnumerable<EmployeeDto>>> GetEmployeeForCompany(Guid companyId)
{
if (! await this._companyRepository.CompanyExistsAsync(companyId))
{
return NotFound();
}
var employees = await this._companyRepository.GetEmployeeAsync(companyId);
return Ok(this._mapper.Map<IEnumerable<EmployeeDto>>(employees));
}
}
}
在调用之前我们还需要丰富一下 RoutineDbContext.cs
类中的种子数据,种子数据如下:
//Company表种子数据
modelBuilder.Entity<Company>().HasData(
new Company
{
Id = Guid.Parse("bbdee09c-089b-4d30-bece-44df5923716c"),
Name = "Microsoft",
Introduction = "Great Company",
},
new Company
{
Id = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716440"),
Name = "Google",
Introduction = "Don't be evil",
},
new Company
{
Id = Guid.Parse("5efc910b-2f45-43df-afae-620d40542853"),
Name = "Alipapa",
Introduction = "Fubao Company",
},
new Company
{
Id = Guid.Parse("bbdee09c-089b-4d30-bece-44df59237100"),
Name = "Tencent",
Introduction = "From Shenzhen",
},
new Company
{
Id = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716400"),
Name = "Baidu",
Introduction = "From Beijing",
},
new Company
{
Id = Guid.Parse("5efc910b-2f45-43df-afae-620d40542800"),
Name = "Adobe",
Introduction = "Photoshop?",
},
new Company
{
Id = Guid.Parse("bbdee09c-089b-4d30-bece-44df59237111"),
Name = "SpaceX",
Introduction = "Wow",
},
new Company
{
Id = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716411"),
Name = "AC Milan",
Introduction = "Football Club",
},
new Company
{
Id = Guid.Parse("5efc910b-2f45-43df-afae-620d40542811"),
Name = "Suning",
Introduction = "From Jiangsu",
},
new Company
{
Id = Guid.Parse("bbdee09c-089b-4d30-bece-44df59237122"),
Name = "Twitter",
Introduction = "Blocked",
},
new Company
{
Id = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716422"),
Name = "Youtube",
Introduction = "Blocked",
},
new Company
{
Id = Guid.Parse("5efc910b-2f45-43df-afae-620d40542822"),
Name = "360",
Introduction = "- -",
},
new Company
{
Id = Guid.Parse("bbdee09c-089b-4d30-bece-44df59237133"),
Name = "Jingdong",
Introduction = "Brothers",
},
new Company
{
Id = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716433"),
Name = "NetEase",
Introduction = "Music?",
},
new Company
{
Id = Guid.Parse("5efc910b-2f45-43df-afae-620d40542833"),
Name = "Amazon",
Introduction = "Store",
},
new Company
{
Id = Guid.Parse("bbdee09c-089b-4d30-bece-44df59237144"),
Name = "AOL",
Introduction = "Not Exists?",
},
new Company
{
Id = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716444"),
Name = "Yahoo",
Introduction = "Who?",
},
new Company
{
Id = Guid.Parse("5efc910b-2f45-43df-afae-620d40542844"),
Name = "Firefox",
Introduction = "Is it a company?",
});
//Employee 表种子数据
modelBuilder.Entity<Employee>().HasData(
new Employee
{
Id = Guid.Parse("4b501cb3-d168-4cc0-b375-48fb33f318a4"),
CompanyId = Guid.Parse("bbdee09c-089b-4d30-bece-44df5923716c"),
DateOfBirth = new DateTime(1976, 1, 2),
EmployeeNo = "MSFT231",
FirstName = "Nick",
LastName = "Carter",
Gender = Gender.男
},
new Employee
{
Id = Guid.Parse("7eaa532c-1be5-472c-a738-94fd26e5fad6"),
CompanyId = Guid.Parse("bbdee09c-089b-4d30-bece-44df5923716c"),
DateOfBirth = new DateTime(1981, 12, 5),
EmployeeNo = "MSFT245",
FirstName = "Vince",
LastName = "Carter",
Gender = Gender.男
},
new Employee
{
Id = Guid.Parse("72457e73-ea34-4e02-b575-8d384e82a481"),
CompanyId = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716440"),
DateOfBirth = new DateTime(1986, 11, 4),
EmployeeNo = "G003",
FirstName = "Mary",
LastName = "King",
Gender = Gender.女
},
new Employee
{
Id = Guid.Parse("7644b71d-d74e-43e2-ac32-8cbadd7b1c3a"),
CompanyId = Guid.Parse("6fb600c1-9011-4fd7-9234-881379716440"),
DateOfBirth = new DateTime(1977, 4, 6),
EmployeeNo = "G097",
FirstName = "Kevin",
LastName = "Richardson",
Gender = Gender.男
},
new Employee
{
Id = Guid.Parse("679dfd33-32e4-4393-b061-f7abb8956f53"),
CompanyId = Guid.Parse("5efc910b-2f45-43df-afae-620d40542853"),
DateOfBirth = new DateTime(1967, 1, 24),
EmployeeNo = "A009",
FirstName = "卡",
LastName = "里",
Gender = Gender.女
},
new Employee
{
Id = Guid.Parse("1861341e-b42b-410c-ae21-cf11f36fc574"),
CompanyId = Guid.Parse("5efc910b-2f45-43df-afae-620d40542853"),
DateOfBirth = new DateTime(1957, 3, 8),
EmployeeNo = "A404",
FirstName = "Not",
LastName = "Man",
Gender = Gender.男
});
数据准备好了之后,我们还需要进行一下数据的迁移操作,我们需要在Nuget
控制台中执行下列命令,进行种子数据的迁移工作.
add-Migration AddEmployeeData
迁移完成只有会在项目中生成一下迁移描述的文件.
完成上述步骤之后,我们启动项目完成迁移,并验证在API中查询父子关系的数据是否正确.
迁移到Employee表的数据信息如下:
查询指定公司下的所有员工,API调用结果:
父子关系的数据在API中的表现(第二种)情况
我们也可以编写查询指定公司下的指定员工信息的接口,代码如下:
[HttpGet("{employeeId}")]
public async Task<ActionResult<EmployeeDto>> GetEmployeeForCompany(Guid companyId, Guid employeeId)
{
if (!await this._companyRepository.CompanyExistsAsync(companyId))
{
return NotFound();
}
if (employee == null)
{
return NotFound();
}
var employee = await this._companyRepository.GetEmployeeAsync(companyId,employeeId);
return Ok(this._mapper.Map<EmployeeDto>(employee));
}
查询指定公司下的指定员工,API调用结果: