千家信息网

如何使用对象到对象映射AutoMapper

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"如何使用对象到对象映射AutoMapper",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何使用对象到对象映射AutoMapper"吧!
千家信息网最后更新 2026年11月01日如何使用对象到对象映射AutoMapper

本篇内容主要讲解"如何使用对象到对象映射AutoMapper",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何使用对象到对象映射AutoMapper"吧!

入门

AutoMapper支持使用静态服务位置构造"自定义值解析器","自定义类型转换器"和"值转换器"的功能:

var configuration = new MapperConfiguration(cfg => {     cfg.ConstructServicesUsing(ObjectFactory.GetInstance);      cfg.CreateMap(); });

或动态服务位置,用于基于实例的容器(包括子容器/嵌套容器):

var mapper = new Mapper(configuration, childContainer.GetInstance);  var dest = mapper.Map(new Source { Value = 15 });

您可以使用配置文件定义配置。然后,通过在启动时调用IServiceCollection扩展方法AddAutoMapper,使AutoMapper知道这些概要文件在哪些程序集中定义:

services.AddAutoMapper(profileAssembly1, profileAssembly2 /*, ...*/);

或标记类型:

services.AddAutoMapper(typeof(ProfileTypeFromAssembly1), typeof(ProfileTypeFromAssembly2) /*, ...*/);

现在,您可以在运行时将AutoMapper注入服务/控制器中:

public class EmployeesController {   private readonly IMapper _mapper;    public EmployeesController(IMapper mapper) => _mapper = mapper;    // use _mapper.Map or _mapper.ProjectTo }

当然还有很多可扩展性,比如:

定制类型转换器

有时,您需要完全控制从一种类型到另一种类型的转换。通常,这是当一种类型看起来与另一种类型不一样时,已经存在转换函数,并且您希望从"松散"类型变为更强的类型,例如字符串的源类型到Int32的目标类型。

例如,假设我们的源类型为:

public class Source {   public string Value1 { get; set; }   public string Value2 { get; set; }   public string Value3 { get; set; } }

但您想将其映射到:

public class Destination {   public int Value1 { get; set; }   public DateTime Value2 { get; set; }   public Type Value3 { get; set; } }

如果我们尝试按原样映射这两种类型,则AutoMapper会抛出异常(在映射时和配置检查时),因为AutoMapper不知道从字符串到int,DateTime或Type的任何映射。要为这些类型创建映射,我们必须提供一个自定义类型转换器,并且我们可以通过三种方式:

void ConvertUsing(Func mappingFunction); void ConvertUsing(ITypeConverter converter); void ConvertUsing() where TTypeConverter : ITypeConverter;

第一个选项就是任何带有源并返回目的地的函数(也有多个重载)。这适用于简单的情况,但对于较大的情况则显得笨拙。在更困难的情况下,我们可以创建一个自定义的ITypeConverter

public interface ITypeConverter {   TDestination Convert(TSource source, TDestination destination, ResolutionContext context); }

并向AutoMapper提供一个自定义类型转换器的实例,或者为类型提供AutoMapper将在运行时实例化的类型。我们上面的源/目标类型的映射配置将变为:

public void Example() {     var configuration = new MapperConfiguration(cfg => {       cfg.CreateMap().ConvertUsing(s => Convert.ToInt32(s));       cfg.CreateMap().ConvertUsing(new DateTimeTypeConverter());       cfg.CreateMap().ConvertUsing();       cfg.CreateMap();     });     configuration.AssertConfigurationIsValid();      var source = new Source     {         Value1 = "5",         Value2 = "01/01/2000",         Value3 = "AutoMapperSamples.GlobalTypeConverters.GlobalTypeConverters+Destination"     };      Destination result = mapper.Map(source);     result.Value3.ShouldEqual(typeof(Destination)); }  public class DateTimeTypeConverter : ITypeConverter {     public DateTime Convert(string source, DateTime destination, ResolutionContext context)     {         return System.Convert.ToDateTime(source);     } }  public class TypeTypeConverter : ITypeConverter {     public Type Convert(string source, Type destination, ResolutionContext context)     {           return Assembly.GetExecutingAssembly().GetType(source);     } }

在第一个映射中,从字符串到Int32,我们仅使用内置的Convert.ToInt32函数(作为方法组提供)。接下来的两个使用自定义ITypeConverter实现。

自定义类型转换器的真正强大之处在于,只要AutoMapper在任何映射类型上找到源/目标对,它们就可以使用。我们可以构建一组自定义类型转换器,并在其上使用其他映射配置,而无需任何其他配置。在上面的示例中,我们不必再次指定string / int转换。由于必须在类型成员级别配置自定义值解析器,因此自定义类型转换器的作用域是全局的。

当然还有很多功能需要去实际项目中实现。

到此,相信大家对"如何使用对象到对象映射AutoMapper"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

类型 转换器 配置 对象 函数 字符 字符串 实例 容器 情况 方法 目标 服务 位置 内容 功能 实际 文件 面的 学习 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州紫鲸互联网科技有限公司 互联网科技财经 科技互联网公司装修 互联网科技金融公司 青岛互联网科技公司 善班互联网科技 嘟嘟瓜互联网科技 互联网科技缩写 易通互联网络科技有限公司 银川新华互联网科技学校地址 农村开互联网科技讲堂 创业天下互联网科技有限公司 全球顶尖互联网科技公司 千方科技属于互联网企业吗 恒生互联网科技业指数调整周期 国大互联网教育科技有限公司薪资 本届互联网大会上的黑科技 广州互联网高科技取餐柜 三亚科技创新互联网基地 黑龙江互联网科技公司 上海睿民互联网科技有限公司 重生之互联网科技帝国 科技平台互联网 互联网科技公司电话 九亚互联网科技 汇久创客互联网科技 深圳卡尔迅互联网科技有限公司怎么样 青海省互联网新科技 天津腾达互联网科技有限公司 每天都有哪些好的互联网科技
0