C# 中AutoMapper的使用方法
作者:一线码农 发布时间:2023-04-06 13:17:04
译文链接: https://www.infoworld.com/art...
AutoMapper 是一个非常流行的 object-to-object 映射库,它的目的就是帮助你实现不同类型对象之间的映射,举一个例子,在 DDD 开发模式中,你可能需要实现将 DTO object 映射为 Model object,在过去,你需要人肉的将这两个类型下的属性字段进行一一映射,现在 AutoMapper 就可以帮你节省 这种冗余的模板式代码 匹配所耗费的时间。
开始玩 AutoMapper 之前,你需要在 Visual Studio 中创建一个 Project 并且安装 AutoMapper,你可以从 NuGet 上下载,也可以在 NuGet Package Manager Console 控制台输入如下命令:
PM> Install-Package AutoMapper
使用 AutoMapper 创建映射关系
像 AutoMapper 这样的 object-to-object 映射工具,它必须能够做到将一种输入类型转换成另一个输出类型,是不是很拗口,可以先考虑下面的两个类。
public class AuthorModel
{
public int Id
{
get; set;
}
public string FirstName
{
get;set;
}
public string LastName
{
get; set;
}
public string Address
{
get; set;
}
}
public class AuthorDTO
{
public int Id
{
get; set;
}
public string FirstName
{
get; set;
}
public string LastName
{
get; set;
}
public string Address
{
get; set;
}
}
接下来,下面的代码段将会告知你如何使用 AutoMapper 在 AuthorModel 和 AuthorDTO 这两个对象之间创建一个 mapping 关系。
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<AuthorModel, AuthorDTO>();
});
最终的 mapping 转换,你还需要增加几句下面的代码,实现两个类型之间的转换。
IMapper iMapper = config.CreateMapper();
var source = new AuthorModel();
var destination = iMapper.Map<AuthorModel, AuthorDTO>(source);
一个 AutoMapper 的例子
接下来可以上一些数据了,可以参考下面的代码片段,我准备先在 source object 上赋值,然后执行 AutoMapper 中的 Map 方法之后,在 destination object 上原样显示出来。
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<AuthorModel, AuthorDTO>();
});
IMapper iMapper = config.CreateMapper();
var source = new AuthorModel();
source.Id = 1;
source.FirstName = "Joydip";
source.LastName = "Kanjilal";
source.Address = "India";
var destination = iMapper.Map<AuthorModel, AuthorDTO>(source);
Console.WriteLine("Author Name: "+ destination.FirstName + " " + destination.LastName);
当你执行完这段代码之后,destination object 上的 Author Name 将会输出到控制台上,目标对象上的 FirstName 和 LastName 和 source object 上的这两个属性值保持一致,说明 automapper 已经帮你成功映射。
值得注意的是,AutoMapper 不仅仅可以 mapping 一个类,还可以 mapping 多个类,默认情况下,AutoMapper会按照默认约定匹配,也就是被mapping的对象之间具有相同的属性名称才能被成功映射,但现实情况下,很多被映射的属性名称是不相同的,这个时候就需要人工介入指定 mapping 关系让 AutoMapper 按照你设定的执行,假定你需要实现 Contact 到 ContactDetails 之间的映射,下面的例子展示了如何去实现这种关系。
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<AuthorModel, AuthorDTO>()
.ForMember(destination => destination.ContactDetails,
opts => opts.MapFrom(source => source.Contact));
});
下面的语句可以创建最终的 destination object 对象。
var destination = iMapper.Map<AuthorModel, AuthorDTO>(source);
有时候你已经生成了 destination object,在这基础上你还想二次映射,这时可以使用下面替代语句。
iMapper.Map(sourceObject, destinationObject);
本质上来说,上面的这段代码常用于匹配两个已存在的 object。
使用 AutoMapping 的 projections 功能
AutoMapper 提供了非常好的 projections 功能,projections 🐂👃的地方在于在 mapping 映射时可以无视两者的 object 数据结构是否一致,比如说让 source 的多个属性 映射到 destination 的一个属性上,而上面我们一直讨论的都是一对一的 object mapping。
接下来我们一起学习下 projection,举个例子,考虑如下类。
public class Address
{
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; }
}
接下来在 AuthorModel 类中新增一个 Address 属性用来存储 Author 的地址信息,修改后的 AuthorModel 类如下:
public class AuthorModel
{
public int Id
{
get; set;
}
public string FirstName
{
get;set;
}
public string LastName
{
get; set;
}
public Address Address
{
get; set;
}
}
然后再更新一下 AuthorDTO 类
public class AuthorDTO
{
public int Id
{
get; set;
}
public string FirstName
{
get; set;
}
public string LastName
{
get; set;
}
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; }
}
接下来我们需要将 AuthorDTO 映射到 AuthorModel,下面的代码片段展示了如何去实现。
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<AuthorDTO, AuthorModel>()
.ForMember(destination => destination.Address,
map => map.MapFrom(
source => new Address
{
City = source .City,
State = source .State,
Country = source.Country
}));
我会在后续的文章中继续讨论 AutoMapper 更多的高级特性,现在,你可以通过这个链接: http://automapper.org/ 去学习更多的 AutoMapper 知识。
更多高质量干货:参见我的 GitHub: dotnetfly
来源:https://segmentfault.com/a/1190000038565837


猜你喜欢
- 首先,ListView不能直接用,要自定义一个,然后重写onMeasure()方法:@Override protected vo
- 本文实例为大家分享了java实现人机猜拳游戏的具体代码,供大家参考,具体内容如下完成人机猜拳互动游戏的开发,用户通过控制台输入实现出拳,电脑
- 一、Vitamio介绍 1.1 Vitamio是什么? Vit
- Feign多参数传递及注意的问题这边沿用前面的Eureka,Feign,Service在服务提供者cloud-shop-userservic
- 本文实例为大家分享了Flutter实现顶部导航栏的具体代码,供大家参考,具体内容如下import 'package:flutter/
- 以下弹出框是框的实现,放入到SWT项目下就可运行。1.提示框MessageBox mb = new MessageBox(shell,SWT
- Spring propagation7种事务配置1、简述在声明式的事务处理中,要配置一个切面,其中就用到了propagation,表示打算对
- 这几天对Android中实现画圆弧及圆弧效果中所实现的效果进行了修改,改为进度圆心进度条,效果如图所示TasksCompletedView.
- 代码一:class Program { static int
- 注意:页面分别拖拽一个FileUpload、Button1、Label1、GridView控件,并新建一个UploadedExcel文件夹D
- 前言在mybatis和mybatis plus里,如果你的实体字段是一个枚举类型,而在数据表里是整型,这时在存储时需要进行处理,默认情况下,
- 本文实例为大家分享了Android拼图小游戏的具体代码,供大家参考,具体内容如下1、效果图:运行时:结束时:2、PuzzleLayoutVi
- 本文实例为大家分享了Android原生视频播放VideoView的具体代码,供大家参考,具体内容如下布局文件activity_video.x
- 本文实例讲述了Android实现基于滑动的SQLite数据分页加载技术。分享给大家供大家参考,具体如下:main.xml如下:<men
- 当把一个事件发布到Spring提供的ApplicationContext中,被 * 侦测到,就会执行对应的处理方法。事件本身事件是一个自定义
- 1.先通过程序生成报表样式的HTML页面,然后修改HTML页面的后缀名为DOC。 2.定制WORD文档的模板文件,在C#中操作WORD模板,
- 本文是利用C# 实现FTP客户端的小例子,主要实现上传,下载,删除等功能,以供学习分享使用。思路:通过读取FTP站点的目录信息,列出对应的文
- 一、前言使用动态配置的原因: properties 和 yaml 是写到项目中的,好多时候有些配置需要修改,每次修改就要重新启动项目,不仅增
- 目录一、定义联合(union)二、初始化联合(union)三、联合体变量的声明四、联合体变量的赋值和使用五、struct和union和区别u
- Android平台已经给我们提供了很多标准的组件,如:TextView、EditView、Button、ImageView、Menu等,还有