首页 > 其他分享 >AutoMapper

AutoMapper

时间:2024-03-20 22:36:24浏览次数:18  
标签:opt src Name 映射 dest Person AutoMapper

AutoMapper 是一个在 .NET 应用程序中自动将一个对象的属性映射到另一个对象的属性的开源库。它旨在减少代码的重复性和提高开发人员的生产力。

在实际应用中,我们常常需要将一个实体对象转换为另一个实体对象,或者从数据访问层获取到的数据对象映射到业务逻辑层的对象。手动实现这种转换往往需要大量的重复代码,而 AutoMapper 则可以大大简化这个过程。

AutoMapper 的主要特点包括:

  • 支持对象间复杂映射关系的配置;
  • 支持映射关系的自动发现,从而减少手动配置的工作量;
  • 支持 Fluent 接口,使得映射关系的配置更加清晰明了;
  • 支持 LINQ 查询中的投影映射;
  • 支持批量映射;
  • 可以与 DI 容器集成;
  • 具有良好的性能。

安装和配置

AutoMapper 可以通过 NuGet 包管理器进行安装,也可以手动下载安装。

在 Visual Studio 中使用 NuGet 安装 AutoMapper,可以通过以下命令:

Install-Package AutoMapper

 

安装完成后,在代码中使用以下命名空间:

using AutoMapper;

 

使用示例

以下是一个简单的使用示例,我们将从一个实体对象 Person 转换为另一个实体对象 PersonDto

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class PersonDto
{
    public string Name { get; set; }
    public int Age { get; set; }
}

// 配置映射关系
Mapper.Initialize(cfg => cfg.CreateMap<Person, PersonDto>());

// 创建源对象
var person = new Person { Name = "张三", Age = 18 };

// 执行映射
var personDto = Mapper.Map<PersonDto>(person);

 

在上面的示例中,我们使用 Mapper.Initialize 方法进行映射关系的配置。该方法接受一个 Action<IMapperConfigurationExpression> 参数,可以使用其中的 CreateMap<TSource, TDestination> 方法进行源类型和目标类型之间的映射关系配置。

在配置完成后,我们可以通过 Mapper.Map<TDestination>(TSource source) 方法执行映射操作。该方法会自动根据映射关系将源对象转换为目标对象。

接下来,我们将介绍 AutoMapper 的更多功能和用法。

基本映射

除了上面的示例,我们还可以通过 Fluent 接口进行映射关系的配置。例如,我们可以将上面的映射关系改写为:

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<Person, PersonDto>()
        .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name))
        .ForMember(dest => dest.Age, opt => opt.MapFrom(src => src.Age));
        
});


在上面的示例中,我们使用 `ForMember` 方法指定了源类型和目标类型之间的映射关系。该方法接受两个参数,第一个参数是目标属性的表达式,第二个参数是选项。

选项中包含多个配置项,可以用于控制映射的行为,例如:

- `MapFrom`:指定源属性的表达式;
- `Ignore`:忽略该属性;
- `Condition`:根据条件判断是否映射该属性;
- `NullSubstitute`:指定当源属性为 null 时,目标属性应该使用的默认值;
- `ConvertUsing`:指定转换器,用于将源属性转换为目标属性。

在实际使用中,我们还可以通过 `ReverseMap` 方法自动生成反向映射关系。例如:
Mapper.Initialize(cfg =>
{
    cfg.CreateMap<Person, PersonDto>()
        .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name))
        .ForMember(dest => dest.Age, opt => opt.MapFrom(src => src.Age))
        .ReverseMap();
});

 

在上面的示例中,我们使用了 ReverseMap 方法,自动生成了从 PersonDto 到 Person 的反向映射关系。

投影映射

除了基本映射,AutoMapper 还支持在 LINQ 查询中使用投影映射。例如,我们可以通过以下代码将 Person 实体对象列表中的所有对象转换为 PersonDto 对象:

var persons = new List<Person>
{
    new Person { Name = "张三", Age = 18 },
    new Person { Name = "李四", Age = 20 },
    new Person { Name = "王五", Age = 22 }
};

var personDtos = persons.Select(p => Mapper.Map<PersonDto>(p)).ToList();

 

在上面的示例中,我们使用 Select 方法对 persons 列表进行投影映射,自动将 Person 对象转换为 PersonDto 对象。

忽略某个属性不映射

CreateMap<DeClass , SoClass>()
//跳过成员AAA的映射 忽略AAA的映射
.ForMember( dest => dest.AAA , opt => opt.Ignore() )

 

null替换

// 当源name中是null时,给目标一个默认值
CreateMap<Sou , Des>().ForMember( destination => destination.name , opt => opt.NullSubstitute( "默认值来了(搞个默认名字)" ) );

 

批量映射

在实际应用中,我们常常需要将多个实体对象转换为另一个实体对象。如果使用循环逐一转换,代码会非常繁琐。而 AutoMapper 可以通过批量映射实现快速转换。

例如,我们可以通过以下代码将 Person 实体对象列表转换为 PersonDto 实体对象列表:

var persons = new List<Person>
{
    new Person { Name = "张三", Age = 18 },
    new Person { Name = "李四", Age = 20 },
    new Person { Name = "王五", Age = 22 }
};

var personDtos = Mapper.Map<List<PersonDto>>(persons);

 

在上面的示例中,我们直接调用 Mapper.Map 方法,将源对象列表转换为目标对象列表。AutoMapper 会自动遍历源列表,依次将每个对象转换为目标对象。

嵌套映射

在实际应用中,我们常常需要将一个复杂的对象转换为另一个复杂的对象。例如,我们有一个包含多个 Person 对象的 Department 对象,我们需要将其转换为一个包含多个 PersonDto 对象的 DepartmentDto 对象。

这时,我们可以使用嵌套映射来解决这个问题。例如,我们可以定义以下实体对象和 DTO 对象:

public class Department
{
    public string Name { get; set; }
    public List<Person> Persons { get; set; }
}

public class DepartmentDto
{
    public string Name { get; set; }
    public List<PersonDto> PersonDtos { get; set; }
}

 

然后,我们可以通过以下代码实现嵌套映射:

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<Person, PersonDto>();
    cfg.CreateMap<Department, DepartmentDto>()
        .ForMember(dest => dest.PersonDtos, opt => opt.MapFrom(src => src.Persons));
});

var department = new Department
{
    Name = "IT部门",
    Persons = new List<Person>
    {
        new Person { Name = "张三", Age = 18 },
        new Person { Name = "李四", Age = 20 },
        new Person { Name = "王五", Age = 22 }
    }
};

var departmentDto = Mapper.Map<DepartmentDto>(department);

 

在上面的示例中,我们先使用 CreateMap 方法定义了 Person 和 PersonDto 之间的映射关系,然后定义了 Department 和 DepartmentDto 之间的映射关系。其中,我们使用 ForMember 方法指定了 PersonDtos 属性与 Persons 属性之间的映射关系。

映射前后处理(BeforeMap AfterMap)

方式1:Profile中直接使用

CreateMap<SourceClass , DestinationClass>()
        .ForMember( dest => dest.year , opt => opt.MapFrom( src => src.age + 2000 ) )
        .AfterMap( ( src , dest ) =>
        {
            DateTime now = DateTime.Now;

            dest.name = "admin";
            dest.now = now;
        } );

 

方式2:实现接口类

实现接口IMappingAction

public class BookAction : IMappingAction<Book , BookDto>
{
        //private readonly IHttpContextAccessor _httpContextAccessor;

        //public BookAction ( IHttpContextAccessor httpContextAccessor )
        //{
        //    如果需要:可以在这里搞依赖注入    
        //    _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException( nameof( httpContextAccessor ) );
        //}

        public void Process ( Book source , BookDto destination , ResolutionContext context )
        {
            DateTime now = DateTime.Now;

            destination.now = now;
        }
}
CreateMap<Book , BookDto>()
                .ForMember( dest => dest.url , opt => opt.MapFrom( src => src.InfoUrl ) )
                //.AfterMap( ( src , dest ) =>
                //{
                //    DateTime now = DateTime.Now;

                //    dest.now = now;
                //} );
                .AfterMap<BookAction>();

 

方式3:转换时直接使用

BookDto _BookDto2 = this.Mapper.Map<Book , BookDto>( newbook , opt =>
            {
                //opt.BeforeMap( ( Book src , BookDto dest ) => src.Value = src.Value + i );
                opt.AfterMap( ( Book src , BookDto dest ) => dest.url = dest.url + "___" );
            } );
var _SPIBOARDBINDSList = this._Mapper.Map<List<BoardBindReturnDto> , List<SPIBOARDBINDS>>( _BoardBindReturnDtoList , ( opt ) =>
            {
                //把id传递过去
                opt.AfterMap( ( List<BoardBindReturnDto> src , List<SPIBOARDBINDS> dest ) =>
                {
                    dest.ForEach( it =>
                    {
                        it.PID = ids;
                    } );
                } );
            } );

 

自定义转换器

在实际应用中,我们常常需要将一种类型的值转换为另一种类型的值。例如,我们需要将一个日期字符串转换为 DateTime 类型的值,或者将一个数字字符串转换为 decimal 类型的值。

AutoMapper 提供了 ConvertUsing 方法,用于自定义转换器。例如,我们可以定义以下转换器,将一个日期字符串转换为 DateTime 类型的值:

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<string, DateTime>().ConvertUsing(s => DateTime.ParseExact(s, "yyyyMMdd", CultureInfo.InvariantCulture));
});

var dateStr = "20230420";
var date = Mapper.Map<DateTime>(dateStr);

 

在上面的示例中,我们使用 ConvertUsing 方法自定义了一个转换器,将日期字符串转换为 DateTime 类型的值。在 ConvertUsing 方法中,我们传入一个转换函数,该函数接受源类型的值作为参数,返回目标类型的值。

标签:opt,src,Name,映射,dest,Person,AutoMapper
From: https://www.cnblogs.com/ysmc/p/18086273

相关文章

  • 实体类与数据库的直接交互问题,DTO,AutoMapper的使用
    实体类、DTO与数据库交互的最佳实践实体类与数据库的直接交互问题在软件开发中,实体类通常被设计为反映业务域的数据模型。这些实体类可能包含以下元素:特性(Attributes):用于定义实体属性的额外信息,比如数据验证规则或ORM(对象关系映射)框架的映射信息。继承关系:实体之间可能存......
  • AutoMapper
    AutoMapper的实现,与应用AutoMapper是一个简单的小库,旨在解决一个看似复杂的问题-摆脱将一个对象映射到另一个对象的代码,比如说当我用前台传来的DTO需要映射到实体的时候,我们总不能一个一个赋值,100个字段,200个字段呢,这里映射代码就很无聊,也很费时间,所有我们用到AutoMapper......
  • 配置AutoMapper
    配置AutoMapperAutoMapper是一个开源的.NET库,用于自动将一个对象的属性映射到另一个对象的属性。它能够简化对象之间的映射过程,减少手动编写重复的映射代码,提高开发效率。1、在需要的层引包(Api和Services层)2、program注入3、在api创建一个文件夹和一个类4、在创建的类里写......
  • AutoMapper
    AutoMapper的实现,与应用AutoMapper是一个简单的小库,旨在解决一个看似复杂的问题-摆脱将一个对象映射到另一个对象的代码,比如说当我用前台传来的DTO需要映射到实体的时候,我们总不能一个一个赋值,100个字段,200个字段呢,这里映射代码就很无聊,也很费时间,所有我们用到AutoMapper......
  • .netCore之Automapper映射封装
    1.Automapper解说Automapper是一个对象与对象的关系映射库,目的就是帮助你实现源类型到目标类型的对象之间的映射2.Automapper的封装A.中间件中添加注册点击查看代码//Automapper映射builder.Services.AddAutoMapper(typeof(AutoMapperConfigs));B.添加特性公共类获取......
  • 使用AutoMapper
    1、在控制台中namespaceStudyAutoMapper{publicclassFoo{publicintID{get;set;}publicstringName{get;set;}}publicclassFooDto{publicintID{get;set;}publicstringName{get;se......
  • 在.net中使用AutoMapper进行对象映射,对象相互转,简单方便
    AutoMapper是一种对象映射工具,它可以帮助我们将不同类型的数据对象之间进行相互转换。在.NET中,我们可以使用AutoMapper库来简化数据对象之间的映射操作,从而提高代码的可读性和可维护性。一、AutoMapper的安装和基本使用安装AutoMapper首先,我们需要在项目中安装AutoMapper库。......
  • automapper 两种初始化方式
     另外一种 选择安装AutoMapper.Extensions.Microsoft.DependencyInjection这个包一种像下面这样收动配置,这种只需要引入基础包AutoMapper.IConfigurationProviderconfig=newMapperConfiguration(cfg=>{cfg.AddProfile<TradeApiMappingProfile>();cfg.AddProfil......
  • Util应用框架基础(二) - 对象到对象映射(AutoMapper)
    本节介绍Util应用框架相似对象之间的转换方法.文章分为多个小节,如果对设计原理不感兴趣,只需阅读基础用法部分即可.概述现代化分层架构,普遍采用了构造块DTO(数据传输对象).DTO是一种参数对象,当WebAPI接收到请求,请求参数被装载到DTO对象中.我们需要把DTO对象转换成实体......
  • .NET6 配置 AutoMapper 与 AutoFac
    AutoMapper 概述1、什么是AutoMapper简单来说,AutoMapper就是一个用C#语言开发的一个轻量的处理一个实体对象到另外一个实体对象映射关系的组件库 官网地址:AutoMapper 文档地址:AutoMapper—AutoMapperdocumentation 2、为什么要用AutoMapper层与层之间的数据转换......