12. 对象数据映射
12.1 对象映射
简单来说,就是将一个对象的数据根据特定规则批量映射到另一个对象中,减少手工操作和降低人为出错率。如将 DTO 对象映射到 Entity 实体中,反之亦然。
12.2 先看例子
在过去,我们需要将一个对象的值转换到另一个对象中,我们需要这样做,如:
上面的例子似乎没有任何问题,但是如果很多地方需要这样的赋值操作、或者相同的赋值操作在多个地方使用,又或者一个类中含有非常多的属性或自定义赋值操作。那么这样的操作效率极低,容易出错,且代码非常臃肿和冗余。
所以,实现自动映射赋值和支持特殊配置的需求就有了。目前 C# 平台有两个优秀的对象映射工具:Mapster 和 AutoMapper。在 Fur 框架中,默认集成的是 Mapster,Mapster 是一款极易使用且超高性能的对象映射框架。
12.3 Mapster 使用
现在,我们可以通过 Mapster 提供的对象映射方法:Adapt 方法改造上面的例子:
12.3.1 极易入门
仅仅一行代码就可以实现 entity -> dto 的转换,如果涉及到赋值的复制操作,如 dto.FullName 和 dto.IdCard,我们只需要自定义映射规则类即可。
12.3.2 自定义映射规则
小知识
该映射文件 Mapper.cs 可以放在任何项目或文件夹中,Fur 会在程序启动的时候自动扫描并注入配置。
12.3.3 依赖注入方式
Mapster 除了提供 Adapt 拓展方法以外,同时还提供依赖注入的方式。
12.3.4 和 EFCore 配合
Mapster 还提供了 ProjectToType Linq 拓展方法减少我们手动 Select 操作,如:
正常的操作:
使用 Mapster 之后:
12.5 全局默认配置
Fur 提供全局默认映射配置选项 TypeAdapterConfig.GlobalSettings.Default,可在 Startup 中配置即可,如:
12.6 EFCore 映射问题
在使用 Mapster 映射实体的时候,如果实体包含 一对多、多对多的导航属性时候,当执行数据库 Update 更新操作的时候,默认就做了全量更新,会影响性能。
所以,社区开发者提供了新的解决方案,可以解决这个问题,代码传送门:TypeAdapterBuilderExtensions.cs
12.7 反馈与建议
与我们交流
给 Fur 提 Issue。
了解更多
想了解更多 Mapster 知识可查阅 Mapster - Wiki 文档。