.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); } }
黄山市民网:https://www.huangshanshimin.com/