在.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 【系统菜单】SysMenuCreateMap<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 【角色】SysRoleCreateMap<AddSysRoleParameters, SysRole>();CreateMap<UpdateSysRoleParameters, SysRole>();#endregion#region 【自定义配置】CustomConfigCreateMap<AddCustomConfigParameters, CustomConfig>();CreateMap<UpdateCustomConfigParameters, CustomConfig>();#endregion#region 【相册】AlbumsCreateMap<AddAlbumsParameters, Albums>();CreateMap<UpdateAlbumsParameters, Albums>();#endregion#region 【照片】PicturesCreateMap<AddPicturesParameters, Pictures>();#endregion#region 【标签】TagsCreateMap<AddTagsParameters, Tags>();CreateMap<UpdateTagsParameters, Tags>();#endregion#region 【栏目】CategoriesCreateMap<AddCategoriesParameters, Categories>();CreateMap<UpdateCategoriesParameters, Categories>();CreateMap<Categories, CategoriesPageDto>();#endregion#region 【标签】TagsCreateMap<AddTalksParameters, Talks>();CreateMap<UpdateTalksParameters, Talks>();#endregion#region 【友情链接】TagsCreateMap<AddFriendLinkParameters, FriendLink>();CreateMap<UpdateFriendLinkParameters, FriendLink>();#endregion#region 【文章】ArticleCreateMap<AddArticleParameters, Article>();CreateMap<UpdateArticleParameters, Article>();#endregion#region 【评论/留言】CommentsCreateMap<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个月之后才可能看到到吧?~ 超小声疑问)