在没有使用其他映射工具时,我们在多模型项目中,转换模型都是直接手写代码,模型多的话,一个一个写很麻烦。
比如在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);