如何使用C# AutoMapper将扁平ViewModel映射到嵌套DTO
实现从扁平ViewModel到嵌套DTO的直接AutoMapper映射
下面提供两种简洁实现方式,核心是通过AutoMapper的映射规则配置,让框架自动处理扁平对象到嵌套对象的转换:
方法1:自定义Profile配置映射规则(推荐)
创建继承自Profile的配置类,集中管理所有映射逻辑,便于后期维护:
public class OrderMappingProfile : Profile { public OrderMappingProfile() { // 配置OrderView到Order的属性映射 CreateMap<OrderView, Order>() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.order_id)); // 配置OrderView到Customer的属性映射 CreateMap<OrderView, Customer>() .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.customer_name)) .ForMember(dest => dest.LastName, opt => opt.MapFrom(src => src.customer_last_name)); // 配置OrderView到OrderDto的嵌套属性映射 CreateMap<OrderView, OrderDto>() .ForMember(dest => dest.Order, opt => opt.MapFrom(src => src)) .ForMember(dest => dest.Customer, opt => opt.MapFrom(src => src)); } }
在项目启动时注册该Profile(以.NET 6+为例):
builder.Services.AddAutoMapper(typeof(OrderMappingProfile));
之后即可通过一行代码完成映射:
var result = _mapper.Map<OrderDto>(orderView);
方法2:直接初始化时链式配置映射规则
若不想单独创建Profile类,可在AutoMapper初始化时一次性完成所有配置:
var configuration = new MapperConfiguration(cfg => { cfg.CreateMap<OrderView, Order>() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.order_id)); cfg.CreateMap<OrderView, Customer>() .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.customer_name)) .ForMember(dest => dest.LastName, opt => opt.MapFrom(src => src.customer_last_name)); cfg.CreateMap<OrderView, OrderDto>() .ForMember(dest => dest.Order, opt => opt.MapFrom(src => cfg.CreateMapper().Map<Order>(src))) .ForMember(dest => dest.Customer, opt => opt.MapFrom(src => cfg.CreateMapper().Map<Customer>(src))); }); var _mapper = configuration.CreateMapper();
同样支持一行代码完成映射:
var result = _mapper.Map<OrderDto>(orderView);
补充说明
- 虽然AutoMapper支持下划线转驼峰的默认命名映射,但显式配置所有跨层级/名称不一致的映射,能提升代码可读性并避免潜在的映射错误。
- 自定义Profile的方式更适合大型项目,可按模块拆分映射规则,便于管理。
内容的提问来源于stack exchange,提问作者El_bosteador
相关产品推荐
相关产品推荐

