深入浅出:AutoMapper 的使用与最佳实践

星球的眼睛  金牌会员 | 2024-11-1 12:05:43 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 660|帖子 660|积分 1980

在现代软件开发中,特别是在 .NET 环境中,数据传输对象(DTO)与实体模型之间的映射是一个常见的需求。AutoMapper 是一个强大的库,可以简化这一过程,减少样板代码,提高开发服从。本文将详细讲解 AutoMapper 的基本概念、各种用法以及最佳实践。
什么是 AutoMapper?

AutoMapper 是一个对象到对象的映射工具,允许开发者在差别类型之间轻松转换数据。它通过约定优于设置的方式来简化映射过程,减少手动编写转换逻辑的需要。
安装 AutoMapper

首先,你需要在项目中安装 AutoMapper。可以通过 NuGet 包管理器来安装:
  1. Install-Package AutoMapper
复制代码
或者使用 .NET CLI:
  1. dotnet add package AutoMapper
复制代码
基本使用

1. 创建映射设置

在使用 AutoMapper 之前,需要先设置映射。通常,在应用程序启动时设置一次。
  1. using AutoMapper;<br>​<br>public class Startup<br>{<br>    public void ConfigureServices(IServiceCollection services)<br>    {<br>        var config = new MapperConfiguration(cfg =><br>        {<br>            cfg.CreateMap<Source, Destination>();<br>        });<br>​<br>        IMapper mapper = config.CreateMapper();<br>        services.AddSingleton(mapper);<br>    }<br>}
复制代码
2. 定义源和目的类

以下是简单的源类和目的类:
  1. public class Source<br>{<br>    public string Name { get; set; }<br>    public int Age { get; set; }<br>}<br>​<br>public class Destination<br>{<br>    public string FullName { get; set; }<br>    public int Age { get; set; }<br>}
复制代码
3. 执行映射

一旦设置完成,你可以在代码中使用 AutoMapper 进行对象转换:
  1. var source = new Source { Name = "John", Age = 30 };<br>var destination = mapper.Map<Destination>(source);<br>​<br>// destination.FullName 将是 "John",destination.Age 将是 30
复制代码
高级特性

1. 属性映射

假如目的类的属性名称与源类不完全相同,可以使用 ForMember 方法自定义映射:
  1. cfg.CreateMap<Source, Destination>()<br>   .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));
复制代码
2. 嵌套映射

AutoMapper 支持嵌套对象的映射。例如,假如 Source 类有一个嵌套对象:
  1. public class Address<br>{<br>    public string City { get; set; }<br>}<br>​<br>public class SourceWithAddress<br>{<br>    public string Name { get; set; }<br>    public Address Address { get; set; }<br>}<br>​<br>public class DestinationWithAddress<br>{<br>    public string FullName { get; set; }<br>    public string City { get; set; }<br>}
复制代码
可以这样设置:
  1. cfg.CreateMap<SourceWithAddress, DestinationWithAddress>()<br>   .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name))<br>   .ForMember(dest => dest.City, opt => opt.MapFrom(src => src.Address.City));
复制代码
3. 自定义类型转换

对于一些复杂的映射需求,AutoMapper 允许定义自定义的转换逻辑:
  1. cfg.CreateMap<Source, Destination>()
  2.    .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => $"{src.Name} (Processed)"));
复制代码
4. 集合映射

AutoMapper 支持集合之间的映射,例如从 List 到 List:
  1. var sources = new List<Source><br>{<br>    new Source { Name = "John", Age = 30 },<br>    new Source { Name = "Jane", Age = 25 }<br>};<br>​<br>var destinations = mapper.Map<List<Destination>>(sources);
复制代码
5. 条件映射

你可以根据特定条件进行映射,好比当某个值不为 null 时:
  1. cfg.CreateMap<Source, Destination>()<br>   .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => <br>       string.IsNullOrEmpty(src.Name) ? "Unknown" : src.Name));
复制代码
6. 执行转换时忽略属性

假如需要在映射时忽略某个属性,可以使用 ForMember 方法:
  1. cfg.CreateMap<Source, Destination>()<br>   .ForMember(dest => dest.Age, opt => opt.Ignore());
复制代码
7. 使用 Profile 组织映射

在大型项目中,使用 AutoMapper 的 Profiles 功能将差别的映射逻辑分组是个好主意:
  1. public class MappingProfile : Profile<br>{<br>    public MappingProfile()<br>    {<br>        CreateMap<Source, Destination>();<br>        CreateMap<SourceWithAddress, DestinationWithAddress>();<br>    }<br>}<br>​<br>// 在 Startup 中添加配置<br>services.AddAutoMapper(typeof(MappingProfile));
复制代码
性能优化

1. 缓存映射设置

AutoMapper 支持缓存映射设置,以提高性能。只需在应用启动时设置一次,并在整个应用中重用相同的 IMapper 实例。
2. 使用 Projection

对于查询操作,可以使用 LINQ 的投影功能,将映射逻辑直接应用于数据库查询,从而避免不须要的对象创建:
  1. var result = dbContext.Sources<br>    .ProjectTo<Destination>(mapper.ConfigurationProvider)<br>    .ToList();
复制代码
测试映射

确保映射的准确性通过单元测试验证映射结果是个好风俗。可以使用 FluentAssertions 来断言映射结果:
  1. [Test]<br>public void Should_Map_Source_To_Destination_Correctly()<br>{<br>    var source = new Source { Name = "John", Age = 30 };<br>    var destination = mapper.Map<Destination>(source);<br>​<br>    destination.FullName.Should().Be("John");<br>    destination.Age.Should().Be(30);<br>}
复制代码
最佳实践


  • 会合设置:将全部映射设置放在一个地方,通常是在应用启动时,以便于管理和维护。
  • 避免过度映射:只映射需要的属性,避免不须要的性能开销。
  • 使用 DTO:确保使用 DTO 来隔离外部接口与内部数据布局,加强系统的可维护性。
  • 定期检察映射设置:随着项目的发展,映射设置大概需要调解,定期检察可以确保映射的正确性和性能。
  • 使用解释:在复杂的映射逻辑中,添加解释以解释意图,资助后续开发者理解。
结论

AutoMapper 是一个强大的工具,可以显著简化对象映射的工作。通过合理的设置和最佳实践,你可以有效地提高代码的可读性和可维护性。在你的下一个 .NET 项目中,不妨尝试使用 AutoMapper,让数据映射变得更加高效。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表