使用 AutoMapper 自动在多个数据模型间进行转换

访问数据库、IPC 通信、业务模型、视图模型……对于同一个业务的同一种数据,经常会使用多种数据模型工作在不同的代码模块中。这时它们之间的互相转换便是大量的重复代码了。

使用 AutoMapper 便可以很方便地在不同的模型之间进行转换而减少编写太多的转换代码(如果这一处的代码对性能不太敏感的话)。

关于 AutoMapper 的系列文章:

  • 使用 AutoMapper 自动在多个数据模型间进行转换

  • 使用 AutoMapper 自动映射模型时,处理不同模型属性缺失的问题

安装 AutoMapper 库

这是 AutoMapper 的官方 GitHub 仓库:

  • AutoMapper/AutoMapper: A convention-based object-object mapper in .NET.

安装 AutoMapper 的 NuGet 包即可在项目中使用 AutoMapper。

入门

以下是一个最简单的控制台演示程序的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Program.cs
var mapper = InitializeMapper();var dao = new Walterlv1Dao
{Id = "2ed3558ac938438fb2c1d2de71d7bb90",Name = "walterlv",Text = "blog.walterlv.com",
};
var vo = mapper.Map<Walterlv1Vo>(dao);
Console.WriteLine($"Name = {vo.Name}, Text = {vo.Text}");static IMapper InitializeMapper()
{var configuration = new MapperConfiguration(cfg =>{cfg.CreateMap<Walterlv1Dao, Walterlv1Vo>();});
#if DEBUGconfiguration.AssertConfigurationIsValid();
#endifvar mapper = configuration.CreateMapper();return mapper;
}

在这段代码中:

  1. 我们定义了一个方法 InitializeMapper,在里面初始化 IMapper 的新实例。

  • 初始化 MapperConfiguration,定义类型的映射关系

  • 在 DEBUG 下验证 MapperConfiguration 的映射是否正确

  • 创建一个 IMapper 的映射器,用于后续映射使用

我们初始化了一个 Walterlv1Dao 类的实例

我们调用 mapper.Map 将其映射到 Walterlv1Vo 类型

这两个类型的定义如下(虽然无关紧要)。

1
2
3
4
5
6
7
8
9
10
11
12
public class Walterlv1Dao
{public string? Id { get; set; }public string? Name { get; set; }public string? Text { get; set; }
}
public class Walterlv1Vo
{public string? Id { get; set; }public string? Name { get; set; }public string? Text { get; set; }
}

如果你的应用程序中会使用到依赖注入,那么只需要把拿到的 IMapper 加入即可。

如果希望两个类型之间能够双向映射,那么在初始化 IMapper 的时候也应该再额外调用一下 ReverseMap 方法,否则就会抛出异常 AutoMapper.AutoMapperMappingException:“Missing type map configuration or unsupported mapping.”。

1
cfg.CreateMap<Walterlv1Dao, Walterlv1Vo>().ReverseMap();

复杂类型和集合

现在,我们让模型稍复杂一些:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Walterlv1Dao
{public string? Id { get; set; }public string? Name { get; set; }public FriendDao? Friend { get; set; }
}
public class FriendDao
{public string? Id { get; set; }public string? Name { get; set; }
}
public class Walterlv1Vo
{public string? Id { get; set; }public string? Name { get; set; }public FriendVo? Friend { get; set; }
}
public class FriendVo
{public string? Id { get; set; }public string? Name { get; set; }
}

AutoMapper 能处理这样的属性嵌套情况,只需要设置嵌套类型也能映射即可:

1
2
cfg.CreateMap<Walterlv1Dao, Walterlv1Vo>().ReverseMap();
cfg.CreateMap<FriendDao, FriendVo>().ReverseMap();

如果两个模型中子模型的类型是一样的,那么只会进行简单的赋值,而不会创建新的对象。

例如上面例子里,如果 FriendDao 和 FriendVo 合并成 Friend 类型,两个类型都使用这个合并的类型,那么映射之后,Friend 将是同一个对象。

除了复杂类型,列表也是可以的:

1
2
3
4
5
6
7
8
9
10
11
12
public class Walterlv1Dao
{public string? Id { get; set; }public string? Name { get; set; }public List<FriendDao>? Friend { get; set; }
}
public class Walterlv1Vo
{public string? Id { get; set; }public string? Name { get; set; }public List<FriendVo>? Friend { get; set; }
}

参考资料

  • AutoMapper/AutoMapper: A convention-based object-object mapper in .NET.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集合类型内建方法

一、集合类型方法方法名称 操作 s.issubset(t)如果s是t的子集&#xff0c;则返回True&#xff0c;否则返回Falses.issuperset(t)如果s是t的超集&#xff0c;则返回True&#xff0c;否则返回Falses.union(t)返回一个新集合&#xff0c;该集合是s和t的并集s.intersection(t)返回…

Maven基础:Maven环境搭建及基本使用(1)

1. Maven环境搭建 1.1 Maven简介 1.2 Maven下载及环境设置 Maven下载地址&#xff1a;http://maven.apache.org/download.cgi 当前下载版本&#xff1a;apache-maven-3.5.0-bin.zip&#xff0c;解压之后路径 D:\Program Files\apache-maven-3.5.0 Maven环境变量设置&#xff1a…

mysql主外键引用关系,关于mysql:数据主/外键关系

我想对于那些已经开发了许多数据库模式的人来说&#xff0c;这将是一个简单的答案&#xff0c;但是我最近发现自己承担了优化(或尝试优化)数据库模式的任务&#xff0c;并且一直在阅读"高性能MySQL"&#xff0c;并且剩下一个关于在模式中使用或"过度使用"外…

解读微软开源MMLSpark:统一的大规模机器学习生态系统

AI前线导读&#xff1a;目前&#xff0c;有很多深度学习框架支持与Spark集成&#xff0c;如Tensorflow on Spark等。然而&#xff0c;微软开源的MMLSpark不仅集成了机器学习框架&#xff08;CNTK深度学习计算框架、LightGBM机器学习框架&#xff09;&#xff0c;还可以将这些计…

floyd判环算法(龟兔赛跑算法)

floyd判环算法&#xff08;龟兔赛跑算法&#xff09; 注意&#xff0c;这个算法是用来判断一条链一条环的图&#xff0c;环的长度或者环与链的交界处的&#xff0c;所以此floyd非彼floyd&#xff08;虽然都是一个人想出来的&#xff09;。 &#xff08;图不是我的&#xff09; …

一个redis的连接库的实现

2019独角兽企业重金招聘Python工程师标准>>> import socketdef format_message( args):"""Create redis message:param args:Message data"""l u"*%d" % len(args)lines [l.encode(utf-8)]for arg in args:if not isinst…

matlab 边缘检测不闭合,Matlab多种图像边缘检测方法

1、用Prewitt算子检测图像的边缘I imread(bacteria.BMP);BW1 edge(I,prewitt,0.04); % 0.04为梯度阈值figure(1);imshow(I);figure(2);imshow(BW1);2、用不同σ值的LoG算子检测图像的边缘I imread(bacteria.BMP);BW1 edge(I,log,0.003); % σ2imshow(BW1);titl…

实现CSS在线美化(格式化)、压缩、加密、解密、混淆工具-toolfk程序员工具网

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱&#xff0c;ToolFk 特色是专注于程序员日常的开发工具&#xff0c;不用安装任何软件&#xff0c;只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。ToolFk还支持 BarCode条形码在线生成、 QueryList采集…

只是他给的实在太多了!

工作几年后&#xff0c;总是会问自己一个问题&#xff0c;工作的意义是什么&#xff1f;这个如果要在网络上寻找答案&#xff0c;那一定是多如牛毛&#xff0c;每一个人都有一套自己的看法。在一开始出入社会工作之时&#xff0c;我并没有意识到这个问题&#xff0c;更没有思考…

[ci]jenkins server启动,通过jnlp的方式启动slave(容器模式)

jenkins server启动,通过jnlp的方式启动slave. java -jar jenkins.jar 配置jnlp端口--全局安全 配置云 配置项目 执行成功 转载于:https://www.cnblogs.com/iiiiher/p/7978831.html

Oracle 中UNDO与REDO的差别具体解释

一 为了更清楚的看出2者差别&#xff0c;请看下表&#xff1a; UNDO REDO Record ofHow to undo a changeHow to reproduce a changeUsed forRollback, Read-ConsistencyRolling forward DB ChangesStored …

php实现文件留言,PHP文件操作及实例:留言板

一、文件操作函数1.创建文件&#xff1a;touch(./xxx.php);bool touch ( string $filename [, int $time time() [, int $atime ]] )2.复制文件&#xff1a;copy(./xxx.php,./yyy.php);3.移动或重命名&#xff1a;rename(./xxx.php,./yyy.php);4.删除文件&#xff1a;unlink(.…

WPF-11 路由事件之一

什么是路由事件&#xff1f;我们从两个维度来理解路由事件&#xff1a;功能的角度来看&#xff0c;路由事件是一种事件类型&#xff0c;不仅仅可以在事件源上处理事件响应&#xff0c;还可以在元素树的多个侦听器上处理事件响应(事件侦听器是附加和调用事件处理程序的元素。事件…

个人总结的一个中高级Java开发工程师或架构师需要掌握的一些技能...

近三年&#xff0c;其实都是在做一个项目&#xff0c;项目是一个大型的多节点部署的项目&#xff0c;做了好几个版本&#xff0c;中间用到了很多技术和框架&#xff0c; 也用了一些管理工具和敏捷实践。我这里不是来说项目的&#xff0c;因为最近看了一些招聘信息&#xff0c;结…

Android 进程常驻(5)----开机广播的简单守护以及总结

这是一个轻量级的库&#xff0c;配置几行代码。就能够实如今android上实现进程常驻&#xff0c;也就是在系统强杀下&#xff0c;以及360获取root权限下。clean master获取root权限下都无法杀死进程 支持系统2.3到6.0 支持大部分设备&#xff0c;包含三星。华为。oppo&#xff0…

[k8s]metricbeat的kubernetes模块kube-metric模块

正确姿势启动metricbeat metricbeat.modules: - module: systemmetricsets:- cpu- filesystem- memory- network- processenabled: trueperiod: 10sprocesses: [.*]cpu_ticks: falseoutput.elasticsearch:hosts: ["http://192.168.x.x:9200"]setup.template.name: &q…

如何为 Task 添加超时功能

前言假设有如下代码&#xff0c;功能是首先从缓存获取数据&#xff0c;如果没有命中缓存&#xff0c;则直接从数据库获取&#xff1a;var data await GetFromCache(); if (data is null) {data await GetFromDB(); }对于获取缓存数据&#xff0c;我们需要限制一下GetFromCach…

php 随机指定位数,php生成一个可选位数的随机码

echo coding(6);function coding($num){$str_arr array(‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘,‘o‘,‘p‘,‘q‘,‘r‘,‘s‘,‘t‘,‘u‘,‘v‘,‘w‘,‘x‘,‘y‘,‘z‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘…

Animate与transform的使用

Animate是用css给前端加载动画的效果&#xff1a; 网址&#xff1a;https://daneden.github.io/animate.css/ <!DOCTYPE html> <html lang"en"> <head><link rel"stylesheet" href"static/css/Animate.css"><meta ch…

angular中的cookies与cookieStore区别

设置cookie用put()方法: $cookies.put(key, value[, options]); $cookieStore.put(key, value); 例如设置一个cookie&#xff0c;名为“userName”&#xff0c;值为“yangmin”&#xff1a; //使用$cookies设置cookie $cookies.put(userName, yangmin); //使用$cookieStore设置…