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