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. oracle用户密码刷新

    1.查询用户信息 col username for a25 col account_status for a18 col profile for a20 select username,account ...

  2. ASP.NET WebForm中asp:Repeater和UI:Grid数据为空时如何显示表头?

    一.asp:Repeater Repeater 控件用于显示被绑定在该控件上的项目的重复列表.Repeater 控件可被绑定到数据库表.XML 文件或者其他项目列表. 1.1-前台页面代码 <a ...

  3. F-Beta-Score

    F1-Score相关概念 F1分数(F1 Score),是统计学中用来衡量二分类(或多任务二分类)模型精确度的一种指标.它同时兼顾了分类模型的准确率和召回率. F1分数可以看作是模型准确率和召回率的一 ...

  4. 史上最强.NET数据分页方法

    [前言] 本文讲述的.NET数据分页方法为[史上最强],已被多家大型科技公司实战采用 & 也被圈内多家知名IT培训机构转载收藏. [正文] 支持.Net Core(2.0及以上)与.Net F ...

  5. 基于 JMeter API 开发性能测试平台

    背景: JMeter 是一个功能强大的性能测试工具,若开发一个性能测试平台,用它作为底层执行引擎在合适不过.如要使用其API,就不得不对JMeter 整个执行流程,常见的类有清楚的了解. 常用的 JM ...

  6. 面霸的自我修养:ThreadLocal专题

    王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 今天是<面霸的自我修养>第5篇文章,我们一起来看看面试中会问到哪些关于ThreadLocal ...

  7. 关闭k8s的pod时减小对服务的影响

    在应用程序的整个生命周期中,正在运行的 pod 会由于多种原因而终止.在某些情况下,Kubernetes 会因用户输入(例如更新或删除 Deployment 时)而终止 pod.在其他情况下,Kube ...

  8. 2023年了,复习了一下spring boot配置使用mongodb

    前言 MongoDB是一个基于分布式文件存储的开源数据库系统,使用C++语言编写.它是一个介于关系数据库和非关系数据库之间的产品,具有类似关系数据库的功能,但又有一些非关系数据库的特点.MongoDB ...

  9. FastGPT 接入飞书(不用写一行代码)

    FastGPT V4 版本已经发布,可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景,例如联网谷歌搜索,操作数据库等等,功能非常强大,还没用过的同学赶紧去试试吧. 飞书相比同类产品算是 ...

  10. Python中的转义符\

    1.转义符 可以百度百科查询 2.Python中的转义符 我目前知道的Python中的转义符使用场景有两个:一个是字符串,一个是正则表达式 2.1.字符串的转义 2.1.1.反斜杠"\&qu ...