在.NET WebAPI项目中,使用AutoMap进行对象映射是一种高效的数据处理方式。通过自动映射机制,可以极大地简化对象之间的转换过程,提高代码的可维护性和整洁性。下面将详细探讨如何在.NET WebAPI中使用AutoMap进行对象映射:
- 安装和配置
- 安装AutoMapper包:需要通过NuGet包管理器安装AutoMapper及其相关依赖包。这包括
AutoMapper
和AutoMapper.Extensions.Microsoft.DependencyInjection
,后者支持依赖注入功能。- 配置服务:在Startup类的
ConfigureServices
方法中添加AutoMapper服务。使用services.AddAutoMapper(Assembly.GetAssembly(typeof(Startup)))
注册AutoMapper,并指定包含映射配置文件的程序集。- 创建映射规则
- 定义映射配置文件:创建继承自
Profile
的配置文件类,如AutoMapperConfigs
,在该类中定义具体的映射规则。例如,使用CreateMap<DBPoundSheet, PoundSheetViewModel>()
和CreateMap<PoundSheetViewModel, DBPoundSheet>()
来创建双向映射。- 配置复杂映射:对于具有不同字段名称或需要进行特殊处理的映射,可以使用
ForMember
方法指定字段的映射规则。例如,从动态JSON数据映射到模型时,可以使用JToken
类结合LINQ查询式来实现复杂的映射逻辑。- 实现映射操作
- 注入IMapper依赖:在需要执行映射操作的服务或控制器中,通过构造函数注入
IMapper
接口实例。确保在类的开始部分声明私有只读的IMapper
字段,以供类的其他方法使用。- 执行映射操作:使用
IMapper
实例的Map
方法来执行实际的对象映射。例如,将PoundSheetViewModel
对象转换为DBPoundSheet
对象,可以使用_mapper.Map<DBPoundSheet>(model)
来实现单个对象的转换。对于集合对象的转换,同样适用此方法。- 优化和维护
- 更新映射配置:随着项目的发展,可能需要修改或增加新的映射规则。这时只需更新或扩展已有的映射配置文件,无需手动修改多处代码,大大简化了维护工作。
- 性能考虑:虽然AutoMapper提供了便利的配置和使用方式,但在某些高性能要求的场景下,仍需注意映射操作的性能影响,避免不必要的复杂映射或频繁的映射操作。
总之,通过上述步骤,可以有效地在.NET WebAPI项目中利用AutoMap进行对象映射,从而提高开发效率和项目的可维护性。
1、新建映射文件类:AutoMapperSetting,继承Profile
public class AutoMapperSetting : Profile
{
//调用CreateMap<A, B>()时,
//A代表源对象类型,而B代表目标对象类型。
//这意味着属性和值将从A复制到B。
//可添加相反的关系,
public AutoMapperSetting()
{
#region 【组织架构】SysOrganization
//CreateMap<SysOrgPageDto, SysOrganization>();
CreateMap<SysOrganization, SysOrgPageDto>();
//CreateMap<SysOrganization, AddOrgParameters>();
CreateMap<AddOrgParameters, SysOrganization>();
//CreateMap<SysOrganization, UpdateOrgParameters>();
CreateMap<UpdateOrgParameters, SysOrganization>();
CreateMap<SysOrganization, UI_TreeSelectDto>()
.ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.Label, opt => opt.MapFrom(src => src.Name));
#endregion
#region 【系统菜单】SysMenu
CreateMap<SysMenu, SysMenuPageDto>();
CreateMap<AddSysMenuParameters, SysMenu>();
CreateMap<UpdateSysMenuParameters, SysMenu>();
CreateMap<SysMenu, UI_TreeSelectDto>()
.ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.Label, opt => opt.MapFrom(src => src.Name));
CreateMap<SysMenu, SysMenuRouterDto>();
#endregion
#region 【角色】SysRole
CreateMap<AddSysRoleParameters, SysRole>();
CreateMap<UpdateSysRoleParameters, SysRole>();
#endregion
#region 【自定义配置】CustomConfig
CreateMap<AddCustomConfigParameters, CustomConfig>();
CreateMap<UpdateCustomConfigParameters, CustomConfig>();
#endregion
#region 【相册】Albums
CreateMap<AddAlbumsParameters, Albums>();
CreateMap<UpdateAlbumsParameters, Albums>();
#endregion
#region 【照片】Pictures
CreateMap<AddPicturesParameters, Pictures>();
#endregion
#region 【标签】Tags
CreateMap<AddTagsParameters, Tags>();
CreateMap<UpdateTagsParameters, Tags>();
#endregion
#region 【栏目】Categories
CreateMap<AddCategoriesParameters, Categories>();
CreateMap<UpdateCategoriesParameters, Categories>();
CreateMap<Categories, CategoriesPageDto>();
#endregion
#region 【标签】Tags
CreateMap<AddTalksParameters, Talks>();
CreateMap<UpdateTalksParameters, Talks>();
#endregion
#region 【友情链接】Tags
CreateMap<AddFriendLinkParameters, FriendLink>();
CreateMap<UpdateFriendLinkParameters, FriendLink>();
#endregion
#region 【文章】Article
CreateMap<AddArticleParameters, Article>();
CreateMap<UpdateArticleParameters, Article>();
#endregion
#region 【评论/留言】Comments
CreateMap<AddCommentsParameters, Comments>();
#endregion
}
}
在案例中,就可以对字段名相同的值进行映射了,
同时也可以对不同名称的字段名称进行指定的映射。
2、添加注入
#region AutoMapper 映射
builder.Services.AddAutoMapper(typeof(AutoMapperSetting));
#endregion
3、使用:
3.1、构造函数引入
private readonly Repository<SysOrganization> _orgRep;
private readonly IHttpContextUser _user;
private readonly IMapper _mapper;
public SysOrganizationService(Repository<SysOrganization> orgRep, IHttpContextUser user, IMapper mapper)
{
_orgRep = orgRep;
_user = user;
_mapper = mapper;
}
3.2、映射:这里以新增为例。
/// <summary>
/// 添加组织机构
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<ApiResult> AddOrg(AddOrgParameters para)
{
var orgEntity = _mapper.Map<SysOrganization>(para);
orgEntity.CreatedTime = DateTime.Now;
orgEntity.CreatedUserId = _user.userId;
var bl = await _orgRep.InsertAsync(orgEntity);
if (!bl)
{
return ApiResultHelper.Error();
}
return ApiResultHelper.Success();
}
4、其他:
以上就是简单的应用了。
另外,也有其他的映射工具nuget包可以达到我们的要求,例如:Mapster、
5、todo
另外今天也是2024高考的第一天,也祝广大学子高考加油!顺利!考出好成绩!
(他们应该要4个月之后才可能看到到吧?~ 超小声疑问)