咱们假设一个场景, 采用EF Core+Web Api, 这时候可能会出现EF Core中的Entity Model和在项目中使用的Model之间对应关系出现误差, 若是使用属性意一一对应, 难免会有大量的工做量, 上代码api
EntityModels.Employee.csapp
public class Employee { public Guid Id { get; set; } public Guid CompanyId { get; set; } public string EmployeeNo { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public Gender Gender { get; set; } public DateTime DateOfBirth { get; set; } public Company Company { get; set; } }
Models.EmployeeDto.csasync
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.Extensions.Microsoft.DependencyInjectionui
能够经过NuGet安装code
使用的时候也很是简单, 创建Profile文件夹, 新建一个EmployeeProfile类, 继承于Profile继承
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)); } }
在使用的时候只须要这样, 注入mapper, 而后就是很简单的操做了, 简直了, 功能很是强大!!!get
[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)); } [HttpPost] public async Task<ActionResult<EmployeeDto>> CreateEmployeeForCompany(Guid companyId, EmployeeAddDto employee) { if (!await _companyRepository.CompanyExistsAsync(companyId)) { return NotFound(); } var entity = _mapper.Map<Employee>(employee); _companyRepository.AddEmployee(companyId, entity); await _companyRepository.SaveAsync(); var dtoToReturn = _mapper.Map<EmployeeDto>(entity); return CreatedAtRoute(nameof(GetEmployeeForCompany), new { companyId = companyId, employeeId = dtoToReturn.Id }, dtoToReturn); } }