前言
AutoMapper 是一个强大的对象映射库,用于简化和自动化复杂对象之间的转换。
官网地址:AutoMapper
文档地址:AutoMapper — AutoMapper documentation
AutoMapper是以.NET(C#)语言开发的一个轻量的处理一个实体对象到另一个实体对象之间映射关系的组件库。开发人员需要做的是通过AutoMapper配置两个实体对象之间的一些映射关系。就可以直接实现映射关系的复用,提高开发效率,减少重复代码。
1. 创建映射
在使用 AutoMapper 之前,需要创建映射配置,通常在 Profile
类中进行:
using AutoMapper;
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<SourceModel, DestinationModel>();
}
}
2. 初始化 AutoMapper
在应用程序启动时,通常会在 Startup.cs
的 ConfigureServices
方法中(.NET Framework)或 Program.cs
(.NET Core)里配置 AutoMapper:
services.AddAutoMapper(typeof(MappingProfile));
// 详细代码过程可参考前文
// 也可以利用反射自动扫描当前程序集中的所有继承 Profile 的配置程序
3. 映射对象
使用以下方法进行对象映射:
-
Mapper.Map<TDestination>(source)
:将源对象映射到目标类型。
var destination = Mapper.Map<DestinationModel>(source);
-
Mapper.Map(source, destination)
:将源对象的值映射到已存在的目标对象。
Mapper.Map(source, destination);
4. 使用依赖注入的 IMapper
如果使用依赖注入,可以直接在构造函数中注入 IMapper
,如下代码:
public class PersonService
{
private readonly IMapper _mapper;
public PersonService(IMapper mapper)
{
_mapper = mapper;
}
public DestinationModel Convert(SourceModel source)
{
return _mapper.Map<DestinationModel>(source);
}
}
5. 配置映射选项
自定义映射的行为可以通过各种选项进行配置。
例如,忽略某些属性、使用自定义转换等:
-
忽略属性:
CreateMap<SourceModel, DestinationModel>() .ForMember(dest => dest.SomeProperty, opt => opt.Ignore());
-
使用自定义转换:
CreateMap<SourceModel, DestinationModel>() .ForMember(dest => dest.SomeProperty, opt => opt.MapFrom(src => CustomConversion(src)));
6. 集合映射
AutoMapper 支持直接映射集合:
var sourceList = new List<SourceModel> { /* ... */ };
var destinationList = _mapper.Map<List<DestinationModel>>(sourceList);
7. 条件映射
支持根据特定条件进行映射:
CreateMap<SourceModel, DestinationModel>()
.ForMember(dest => dest.SomeProperty,
opt => opt.Condition(src => src.SomeCondition == true));
8. 映射嵌套对象
AutoMapper 还支持嵌套对象的映射:
CreateMap<ParentSourceModel, ParentDestinationModel>();
CreateMap<ChildSourceModel, ChildDestinationModel>();
只需创建好子映射,AutoMapper 会自动处理嵌套关系。
9. 自定义解析器
可以定义自定义解析器以处理更复杂的映射逻辑:
// 自定义解析器
public class CustomValueResolver : IValueResolver<SourceModel, DestinationModel, string>
{
public string Resolve(SourceModel source, DestinationModel destination, string destMember, ResolutionContext context)
{
// 返回处理后的值
return source.SomeProperty + " - custom";
}
}
// 在映射中使用自定义解析器
CreateMap<SourceModel, DestinationModel>()
.ForMember(dest => dest.SomeProperty, opt => opt.MapFrom<CustomValueResolver>());
10. 逆向映射
可以启用逆向映射以允许从目标类型到源类型的映射,这在需要从 DTO 转换回实体时非常有用:
CreateMap<SourceModel, DestinationModel>()
.ReverseMap();
总结
以上是 AutoMapper 的一些常用方法和功能。
在实际使用中,可以根据具体需求创建和配置映射,以确保对象之间的转换能满足业务的要求。