.Net Core Dto映射(AutoMapper)

我们假设一个场景, 采用EF Core+Web Api, 这时候可能会出现EF Core中的Entity Model和在项目中使用的Model之间对应关系出现偏差, 如果使用属性意一一对应, 不免会有大量的工作量, 上代码

EntityModels.Employee.cs

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.cs

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.DependencyInjection

可以通过NuGet安装

使用的时候也非常简单, 建立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, 然后就是很简单的操作了, 简直了, 功能非常强大!!!

[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);
}
}

最新文章

  1. 博客搬家。新博客地址 http://fangjian0423.github.io/
  2. 消灭Bug!18款最佳的问题跟踪管理应用程序
  3. oracle数据库创建用户,并且给用户授权
  4. Linux日志文件系统(EXT4、XFS、JFS)及性能分析
  5. 【HDOJ】3285 Convex Hull of Lattice Points
  6. Java--日期的使用
  7. cocos2d-html5基金会
  8. Web采矿技术
  9. windows cmd启动heritrix
  10. DataTable 转实体
  11. [luogu P3128][USACO15DEC]Max Flow [LCA][树上差分]
  12. git 在linux下服务端搭建
  13. deeplearning.ai 人工智能行业大师访谈 Geoffrey Hinton 听课笔记
  14. Hibernate入门这一篇就够了
  15. 网页静态化技术--Freemarker入门
  16. AS 400 常用命令
  17. Codeforces 888 简要题解
  18. Flutter - Migrate to AndroidX
  19. docker的安装和使用
  20. 【BZOJ1030】【JSOI2007】文本生成器

热门文章

  1. HTTP协议层面绕过WAF
  2. 【C】C语言大作业——学生学籍管理系统
  3. 《剑指offer》面试题36. 二叉搜索树与双向链表
  4. golang中数组指针与指针数组的区别实现
  5. kubernetes之配置Metrics Server
  6. ERNIE代码解析
  7. Photoshop如何快速扣取图标
  8. Element Plus 正式版发布啦!&#127881;&#127881;
  9. 详解git pull和git fetch的区别(原理)
  10. 生成&quot;cmd.exe&quot;错误