在分层设计模式中,各层之间的数据通常通过数据传输对象(DTO)来进行数据的传递,而大多数情况下,各层数据的定义结构大同小异,如何在这些定义结构中相互转换,之前我们通过使用AutoMapper库,但AutoMapper功能庞大,使用较为复杂,而在很多场景下,可能我们只需要一些基础的对象映射功能,那么此时你可以选择扩展库中的轻量级AutoMapper实现。

实体映射包含以下核心功能:

  • 在使用之前无需手动定义类型之间的映射关系
  • 采用动态编译、缓存转换委托,提升性能。
  • 支持通过特性定义属性映射关系
  • 支持插入自定义的转换处理方法
  • 支持列表转换
  • 支持嵌套类型转换
  • 支持循环引用及引用关系维持
  • 支持转换模式或拷贝模式
  • 支持生成预定义的拷贝委托
  • 为了保持其轻量性,目前支持以下转换
    • 值类型转换
    • 数值类型之间的兼容转换(如int-->uint)
    • 支持值类型与其可空类型间的兼容转换
    • 字典类型转换
    • 列表类型转换
    • 枚举类型与string类型间的转换
    • 不支持结构体之间的转换以及结构体与类之间的转换

一、启用

启用轻量级的实体映射,有两种方式:

  • 如果你是和扩展库其他功能同时使用,可直接通过UseExtensions即可
    using IHost host = Host.CreateDefaultBuilder()
// UseExtensions会自动注入Mapper
.UseExtensions()
.ConfigureServices(sc =>
{
// 通过ConfigureLightweightMapper来配置映射
sc.ConfigureLightweightMapper(options =>
{
//
});
})
.Build();
  • 如果你需要单独使用,可通过IServiceCollection上的AddLightweightMapper方法启用
    //实体转换
serviceDescriptors.AddLightweightMapper()
.ConfigureLightweightMapper(options =>
{
//
});

二、配置自定义转换逻辑

你可以通过映射设置上的AddConvert来配置对应设置实体转换的后置逻辑,如下所示。

    //实体转换
serviceDescriptors.AddLightweightMapper()
.ConfigureLightweightMapper(options =>
{
// 通过AddConvert可自定义转换逻辑
// 以下定义从SourceA转换到TargetB时,自动设置属性C的值
options.AddConvert<SourceA, TargetB>((mapper, a, b) =>
{
b.C = "C";
});
});

三、使用

你可以通过IMapperProvider的GetMapper方法或IMapper<,>直接获取Mapper实例。

  • 通过IMapperProvider
// 通过IMapperProvider
var mapperProvider = host.Services.GetRequiredService<IMapperProvider>();
var mapper = mapperProvider.GetMapper<SourceA, TargetA>();
var targetA = mapper.Convert(sourceA);
  • 通过IMapper<,>
var mapperB = host.Services.GetRequiredService<IMapper<SourceA, TargetB>>();
var targetB = mapperB.Convert(sourceA);

四、通过特性指定属性映射关系

默认映射按照属性名称进行,你也可以通过MapperPropertyNameAttribute特性进行指定。

MapperPropertyNameAttribute:

属性名 类型 说明
Name String 目标或源的名称
TargetType Type 映射到的目标类型
SourceType Type 映射到当前类型的来源类型

通过SourceType或TargetType你可以根据需求灵活的在源类型或目标类型上设置映射关系。

五、拷贝

实体映射也提供了拷贝方法,通过该方法可以将源实体属性拷贝到目标实体。

  • 通过IMapper<,>的CopyTo方法进行默认拷贝:
var mapperB = host.Services.GetRequiredService<IMapper<SourceA, TargetB>>();
var targetB1 = new TargetB();
mapperB.CopyTo(sourceA, targetB1);
  • 通过DefineCopyTo方法定义排除字段外的拷贝委托
var mapperB = host.Services.GetRequiredService<IMapper<SourceA, TargetB>>();
// 只拷贝指定字段之外的属性
var copyProc = mapperB.DefineCopyTo(a =>
new
{
a.A //忽略属性A
});
var targetB2 = new TargetB();
copyProc(sourceA, targetB2);

六、示例

以上示例完整项目,请参考GitHub示例

最新文章

  1. Summernote
  2. Web报表页面如何传递中文参数
  3. C实现通用数据结构--双向链表
  4. 减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术)
  5. javaNIO是什么?由那几部分组成?各部分的作用。
  6. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:4.安装Oracle RAC FAQ-4.4.无法图形化安装Grid Infrastructure
  7. Django中如何使用django-celery完成异步任务2(转)
  8. Quartz Scheduler 开发指南(1)
  9. WebApi HttpMsgHanler的执行顺序
  10. PRML 第一章mindmap
  11. a标签屏蔽href跳转
  12. Python之路-Linux命令基础(1)
  13. MyEclipse修改项目名称后,部署到tomcat问题。
  14. [转载]&mdash;&mdash;说说IO
  15. [Swift]LeetCode221. 最大正方形 | Maximal Square
  16. 1、mysql初识
  17. 运用Zabbix实现内网服务器状态及局域网状况监控(3) —— Zabbix服务端安装
  18. 基于binlog来分析mysql的行记录修改情况
  19. 通过request获取网页资讯 通过BeautifulSoup剖析网页元素
  20. k8s官方安装版本

热门文章

  1. Codeforces 11D A Simple Task 统计简单无向图中环的个数(非原创)
  2. redis持久化-AOF
  3. Ubuntu-16.04下Docker通过阿里云镜像安装(apt-get)
  4. 017.NET5_内置容器基本使用
  5. HLOD System
  6. WiFi 测速
  7. vue3 deep dive
  8. App Store Previewer
  9. Chrome DevTools &amp; console &amp; filter warning
  10. C++算法代码——阿克曼函数