在沒有使用其他映射工具時,我們在多模型項目中,轉換模型都是直接手寫代碼,模型多的話,一個一個寫很麻煩。
比如在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);