框架使用AutoMapper来处理对象与对象之间的转换,比较好的处理实体模型和视图模型之间的转换,在代码优化层面起到了很好的作用;
一、相关的依赖注入配置
builder.Services.AddAutoMapperSetup();
相关参数设置
// 不需要配置
二、使用方式
1、定义数据库实体模型
/// <summary>
/// 用户信息表-实体模型
/// </summary>
[SugarTable("SysUserInfo", "用户表")]
public class SysUserInfo : SysUserInfoRoot<long>
{
public string LoginName { get; set; }
/// <summary>
/// 登录密码
/// </summary>
[SugarColumn(Length = 200, IsNullable = true)]
public string LoginPWD { get; set; }
// 更多字段...
}
2、定义要转换的视图模型
public class SysUserInfoDto : SysUserInfoDtoRoot<long>
{
public string uLoginName { get; set; }
public string uLoginPWD { get; set; }
// 更多字段...
}
3、配置两个类的字段映射关系,也可以做类型转换,比如字符串转时间类型等等
注意:为防止出现遗漏问题,两个方向都需要配置
/// <summary>
/// 配置构造函数,用来创建关系映射
/// </summary>
public CustomProfile()
{
// 实体模型向视图模型转换
CreateMap<SysUserInfo, SysUserInfoDto>()
.ForMember(a => a.uLoginName, o => o.MapFrom(d => d.LoginName))
.ForMember(a => a.uLoginPWD, o => o.MapFrom(d => d.LoginPWD));
// 视图模型向实体模型转换
CreateMap<SysUserInfoDto, SysUserInfo>()
.ForMember(a => a.LoginName, o => o.MapFrom(d => d.uLoginName))
.ForMember(a => a.LoginPWD, o => o.MapFrom(d => d.uLoginPWD));
}
4、最后在需要用的地方直接依赖注入IMapper<>来使用
private readonly IMapper _mapper;
/// <summary>
/// 构造函数
/// </summary>
public UserRoleController(IMapper mapper)
{
_mapper = mapper;
}
[ ]
public async Task<MessageModel<SysUserInfoDto>> AddUser(string loginName, string loginPwd)
{
var userInfo = await _sysUserInfoServices.SaveUserInfo(loginName, loginPwd);
return new MessageModel<SysUserInfoDto>()
{
success = true,
msg = "添加成功",
response = _mapper.Map<SysUserInfoDto>(userInfo)
};
}