【ASP.NET】使用模型映射工具AutoMapper映射DataModel和Dto

在没有使用其他映射工具时,我们在多模型项目中,转换模型都是直接手写代码,模型多的话,一个一个写很麻烦。

比如在DataModel转Dto,或者在Dto转ViewModel中,我们可以使用模型映射工具,模型自动映射。比如使用AutoMapper。

 

我们先创建几个模型

用户信息(DataModel)

public class UserInfo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Pwd { get; set; }
    public int Age { get; set; }
    public bool IsDeleted { get; set; }
}

用户信息(Dto)

public class UserInfoDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Pwd { get; set; }
    public int Age { get; set; }
}

创建一个数据,模拟从数据库获取

UserInfo userInfo = new UserInfo
{
    Id = 1001,
    Name = "haha",
    Pwd = "123",
    Age = 18,
    IsDeleted = false
};

DataModel转Dti时,我们这么写

UserInfoDto userInfoDto = new UserInfoDto
{
    Id = userInfo.Id,
    Name = userInfo.Name,
    Pwd = userInfo.Pwd,
    Age = userInfo.Age,
};

在项目中,有很多模型转换的地方,这样写很麻烦

 

下面开始使用AutoMapper

在NuGet下载AutoMapper包

 

使用

UserInfo userInfo = new UserInfo
{
    Id = 1001,
    Name = "haha",
    Pwd = "123",
    Age = 18,
    IsDeleted = false
};


AutoMapper.Mapper.Initialize(m =>
{
    m.CreateMap<UserInfo, UserInfoDto>();
});

UserInfoDto userInfoDto = AutoMapper.Mapper.Map<UserInfoDto>(userInfo);

上面适用于,两个模型的字段类型都相同

 

如果两个模型的名称不同,则需要进行特殊的操作

public class UserInfo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Pwd { get; set; }
    public int Age { get; set; }
    public bool IsDeleted { get; set; }
    public DateTime CreatedTime { get; set; }
}

public class UserInfoDto
{
    public string UserName { get; set; }
    public int Age { get; set; }
    public string CreatedTime { get; set; }
}

例如

UserInfo userInfo = new UserInfo
{
    Id = 1001,
    Name = "haha",
    Pwd = "123",
    Age = 18,
    IsDeleted = false,
    CreatedTime = DateTime.Now
};

AutoMapper.Mapper.Initialize(m =>
{
    //UserInfo转UserInfoDto
    m.CreateMap<UserInfo, UserInfoDto>()
    //映射前处理
    .BeforeMap((src, dest) => src.Age += 10)

    //匹配不同的字段名称
    .ForMember(dest => dest.UserName, opt => opt.MapFrom(src => src.Name))
    .ForMember(dest => dest.CreatedTime, opt => opt.MapFrom(src => src.CreatedTime.ToString("yyyy-MM-dd")))

    //映射后处理
    .AfterMap((src, dest) => dest.UserName = "姓名:" + dest.UserName)
    //设置反向映射
    .ReverseMap();
});

UserInfoDto userInfoDto = AutoMapper.Mapper.Map<UserInfoDto>(userInfo);

UserInfo user = AutoMapper.Mapper.Map<UserInfo>(userInfoDto);

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GreAmbWang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值