AutoMapper是一种对象映射工具,它可以帮助我们将不同类型的数据对象之间进行相互转换。在.NET中,我们可以使用AutoMapper库来简化数据对象之间的映射操作,从而提高代码的可读性和可维护性。

一、AutoMapper的安装和基本使用

  1. 安装AutoMapper

首先,我们需要在项目中安装AutoMapper库。通过NuGet包管理器,我们可以方便地安装AutoMapper。在Visual Studio中,右键点击项目->管理NuGet程序包->浏览->搜索AutoMapper->安装即可。

  1. 定义数据模型

假设我们有两个类,一个是Source类,另一个是Destination类。我们希望将Source类的实例映射到Destination类。

public class Source
{
public int SomeValue { get; set; }
public string SomeString { get; set; }
} public class Destination
{
public int SomeValue { get; set; }
public string SomeString { get; set; }
}
  1. 配置AutoMapper映射

我们在应用程序的配置文件(例如appsettings.json)中定义AutoMapper的映射配置。在这种情况下,我们定义了Source类和Destination类之间的映射关系。

{
"AutoMapper": {
"Maps": {
"SourceToDestination": {
"SomeValue": "SomeValue",
"SomeString": "SomeString"
}
}
}
}
  1. 使用AutoMapper进行映射

现在我们可以在代码中使用AutoMapper来将Source对象映射到Destination对象。

IMapper mapper = ConfigurationManager.GetService<IMapper>();
Source source = new Source { SomeValue = 5, SomeString = "Hello" };
Destination destination = mapper.Map<Destination>(source);

二、AutoMapper的高级应用

  1. 嵌套对象的映射

如果我们的Source类和Destination类具有嵌套的对象,我们可以使用AutoMapper来处理这些嵌套对象的映射。假设Source类有一个嵌套的Person类,而Destination类有一个嵌套的PersonDTO类,我们可以这样定义映射:

{
"AutoMapper": {
"Maps": {
"SourceToDestination": {
"SomeValue": "SomeValue",
"SomeString": "SomeString",
"Person.Name": "PersonDTO.Name",
"Person.Age": "PersonDTO.Age"
}
}
}
}
  1. 使用MapFrom和Condition进行自定义映射规则

有时候我们可能需要在映射过程中应用一些自定义的映射规则。AutoMapper提供了MapFrom和Condition关键字,可以让我们在映射过程中应用自定义的规则。例如,假设我们在映射Source类到Destination类时,希望将Source类的SomeString属性转换为大写,我们可以这样定义映射规则:

{
"AutoMapper": {
"Maps": {
"SourceToDestination": {
"SomeValue": "SomeValue",
"SomeString": {
"MapFrom": "ConvertToUpper",
"Condition": "it.SomeString != null"
}
}
}
},
"AutoMapperExternals": {
"Converts": [ { "Type": "System.String", "ConvertUsing": "ConvertToUpper" } ]
}
}

其中,在代码中我们需要定义一个ConvertToUpper方法来将字符串转换为大写。

public class StringConverter : ITypeConverter<string, string>
{
public string Convert(ResolutionContext context) => context.SourceValue.ToUpper();
}
  1. 映射继承属性

如果你有一个基类或接口,并且你想将该基类或接口的派生类映射到另一个对象,那么你可以使用AutoMapper的继承映射功能。你只需要在映射配置中指定基类和派生类之间的映射关系。

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
} public class Employee : Person
{
public string Department { get; set; }
} // 在映射配置中指定继承映射关系
cfg.CreateMap<Person, Employee>();
  1. 使用IgnoreMember和IncludeMember

有时候你可能会遇到一些不需要映射的属性,或者只希望映射对象的一部分属性。这时,你可以使用IgnoreMember和IncludeMember来控制映射过程。

// 忽略Source对象的某些属性
cfg.CreateMap<Source, Destination>().ForMember(dest => dest.IgnoredProperty, opt => opt.Ignore()); // 只映射Source对象的某些属性
cfg.CreateMap<Source, Destination>().ForMember(dest => dest.IncludedProperty, opt => opt.Include("SomeProperty"));
  1. 使用MapFrom和Condition

MapFrom和Condition可以让你在映射过程中执行更复杂的逻辑。比如,你可以使用MapFrom指定一个方法来确定目标属性的值,或者使用Condition来控制映射的条件。

// 使用MapFrom指定一个方法来确定目标属性的值
cfg.CreateMap<Source, Destination>().ForMember(dest => dest.ComputedProperty, opt => opt.MapFrom(src => CalculateValue(src))); // 使用Condition来控制映射的条件
cfg.CreateMap<Source, Destination>().ForMember(dest => dest.ConditionalProperty, opt => opt.Condition(src => src.SomeProperty != null));
  1. 自定义分辨率器

有时候你可能会需要在映射过程中使用自定义的分辨率器。你可以实现AutoMapper的IValueResolver接口,并实现自己的分辨率逻辑。

public class CustomResolver : IValueResolver<Source, Destination, string>
{
public string Resolve(Source source, Destination destination, string member, IMappingExpression mapping)
{
// 实现自己的分辨率逻辑
return ResolveValue(source);
}
} // 在映射配置中使用自定义分辨率器
cfg.CreateMap<Source, Destination>().ForMember(dest => dest.Property, opt => opt.ResolveUsing<CustomResolver>());

这些是AutoMapper的一些高级应用,可以帮助你更灵活地处理对象映射的各种情况。通过合理的配置和扩展AutoMapper,可以简化代码并提高开发效率.

更多技术文章,技术资源请关注公众号:架构师宝库

作者简介:
公众号【架构师宝库】,头条号【架构师老卢】20年资深软件架构师,分享编程、软件设计经验,教授前沿技术,分享技术资源(每天分享一本电子书),分享职场感悟。

在.net中使用AutoMapper进行对象映射,对象相互转,简单方便的更多相关文章

  1. 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射

    一.前言 在实际项目开发过程中,我们使用到的各种 ORM 组件都可以很便捷的将我们获取到的数据绑定到对应的 List<T> 集合中,因为我们最终想要在页面上展示的数据与数据库实体类之间可能 ...

  2. ASP.NET Core Web 应用程序系列(五)- 在ASP.NET Core中使用AutoMapper进行实体映射

    本章主要简单介绍下在ASP.NET Core中如何使用AutoMapper进行实体映射.在正式进入主题之前我们来看下几个概念: 1.数据库持久化对象PO(Persistent Object):顾名思义 ...

  3. 在MVC架构中使用CodeSmith生成NHibernate映射对象和实体类

    第一步:找到生成模板,如下图 第二步:配置数据库连接(如下图),然后右击第一步找到的模板,点击Excute 第三步:执行操做(如下图) 第四步: 找到之前配置生成的文件夹,找到如下文件(图中标记的文件 ...

  4. .NET CORE 中使用AutoMapper进行对象映射

    简介 AutoMapper uses a fluent configuration API to define an object-object mapping strategy. AutoMappe ...

  5. ASP.NET CORE 中使用AutoMapper进行对象映射

    ASP.NET CORE 中使用AutoMapper进行对象映射 1.什么是AutoMapper? AutoMapper是基于对象到对象约定的映射工具,常用于(但并不仅限制于)把复杂的对象模型转为DT ...

  6. ASP.NET Core 中的对象映射之 AutoMapper

    目录 AutoMapper 简介 AutoMapper 使用 初始化 Profile设置 扁平化映射 集合映射 投影 条件映射 值转换 设置转换前后行为 配置验证及设置 反向映射 自定义转换器 自定义 ...

  7. 对象映射工具AutoMapper介绍

    AutoMapper是用来解决对象之间映射转换的类库.对于我们开发人员来说,写对象之间互相转换的代码是一件极其浪费生命的事情,AutoMapper能够帮助我们节省不少时间. 一. AutoMapper ...

  8. EF架构~AutoMapper对象映射工具简化了实体赋值的过程

    回到目录 AutoMapper是一个.NET的对象映射工具,一般地,我们进行面向服务的开发时,都会涉及到DTO的概念,即数据传输对象,而为了减少系统的负载,一般我们不会把整个表的字段作为传输的数据,而 ...

  9. 一文为你详细讲解对象映射库【AutoMapper】所支持场景

    前言 在AutoMapper未出世前,对象与对象之间的映射,我们只能通过手动为每个属性一一赋值,时间长了不仅是我们而且老外也觉得映射代码很无聊啊.这个时候老外的所写的强大映射库AutoMapper横空 ...

  10. .NET之AutoMapper对象映射工具运用

    AutoMapper对象映射工具:主要是将某一个实体转成另一个实体. 1.引用NuGet包;搜索:AutoMapper 2.创建实体类 using System; using System.Colle ...

随机推荐

  1. UE源码分析:Slate 类鼠标输入处理

    序言 UE4.25版本 本章看一下UE的 "类鼠标"输入处理(其实就是鼠标和触摸的输入,我也没找到专门的术语来代指,英文UE用的是PointerXXX),主要是按下.移动.抬起等相 ...

  2. 【动画进阶】神奇的 3D 磨砂玻璃透视效果

    最近,群友分享了一个很有意思的效果: 原效果的网址:frosted-glass.该效果的几个核心点: 毛玻璃磨砂效果 卡片的 3D 旋转跟随效果 整体透明度和磨砂感.以及卡片的 3D 形态会随着用户移 ...

  3. spring多数据源动态切换的实现原理及读写分离的应用

    简介 AbstractRoutingDataSource是Spring框架中的一个抽象类,可以实现多数据源的动态切换和路由,以满足复杂的业务需求和提高系统的性能.可扩展性.灵活性. 应用场景 多租户支 ...

  4. 数据结构之B树

    1 引言 B-tree,B即Balanced,是自平衡的多叉搜索树,用于组织和存储大量数据,以及数据库和文件系统等需要高效查找和插入操作的应用中. 为什么是"大量数据"?当主存不足 ...

  5. Programming abstractions in C阅读笔记:p107-p110

    <Programming Abstractions In C>学习第46天,p107-p110,3.1小节--"The concept of interface",总结 ...

  6. 监控keepalived_vip控制容器的状态

    需求:监控server服务器的vip状态,如果vip存在,则判断容器是否启动,如果没有启动,则启动容器.如果vip不存在则关闭容器. 方法一: 查看代码 #!/bin/bash ip add | gr ...

  7. Java日志系列:日志门面JCL、SLF4J

    目录 一.日志门面说明 二.JCL 使用 JCL 入门 JCL 原理 三.SLF4J 使用 配合自身简单日志实现(slf4j-simple) 配置logback日志实现 配置Log4J日志实现(需适配 ...

  8. 快手商品详情API接口如何使用

    使用快手开的API接口获取商品详情,可按照以下步骤进行: 1.注册账号并创建应用 注册开发者账号,并在账号后台中创建一个应用,获得AppKey和AppSecret等信息.这些信息是使用API接口访问快 ...

  9. iOS添加图片

    添加一个按钮 将图片添加到

  10. [Mysql] 存储过程简单理解

    什么是存储过程 简单的说, 就是一组SQL语句集, 功能强大, 可以实现一些比较复杂的逻辑功能. 其实就和编程语言的面向过程函数一样. ps: 存储过程与触发器类似, 但存储过程是主动调用, 触发器是 ...