.NET Core中使用AutoMapper将复杂请求对象映射为多DTO的问题
解决AutoMapper将Request映射到两个独立DTO的问题
首先,先明确类结构(基于你的描述补充):
// 请求类 public class Request { public string Type { get; set; } public string Value { get; set; } public InnerSource InnerSource { get; set; } } public class InnerSource { public string SourceId { get; set; } public string SourceName { get; set; } } // DTO类 public class RequestDto { public string Type { get; set; } public string Value { get; set; } } public class InnerSourceDto { public string SourceId { get; set; } public string SourceName { get; set; } }
正确的映射配置
你的问题出在IncludeMembers的用法上——AutoMapper需要先知道如何映射InnerSource到InnerSourceDto,才能通过IncludeMembers从Request.InnerSource提取属性。
修改后的映射配置如下:
// 1. 配置Request到RequestDto的基础映射(这个你原来的写法是对的) CreateMap<Request, RequestDto>(); // 2. 先配置InnerSource到InnerSourceDto的映射 CreateMap<InnerSource, InnerSourceDto>(); // 3. 再配置Request到InnerSourceDto,通过IncludeMembers复用上面的映射 CreateMap<Request, InnerSourceDto>() .IncludeMembers(src => src.InnerSource);
替代方案(无需IncludeMembers)
如果不想依赖IncludeMembers,可以直接指定每个DTO属性的来源:
CreateMap<Request, RequestDto>(); CreateMap<Request, InnerSourceDto>() .ForMember(dest => dest.SourceId, opt => opt.MapFrom(src => src.InnerSource.SourceId)) .ForMember(dest => dest.SourceName, opt => opt.MapFrom(src => src.InnerSource.SourceName));
使用方式
在你的API服务或控制器中注入IMapper后,直接调用映射方法即可:
// 假设从请求体获取到Request实例 var request = await HttpContext.Request.ReadFromJsonAsync<Request>(); // 映射得到两个DTO var requestDto = _mapper.Map<RequestDto>(request); var innerSourceDto = _mapper.Map<InnerSourceDto>(request); // 后续用这两个DTO通过EntityFramework存入数据库
验证映射配置
如果不确定配置是否正确,可以在启动时添加配置验证,快速定位未映射的属性:
// 在Program.cs中添加 builder.Services.AddAutoMapper(config => { // 你的映射配置代码 config.CreateMap<Request, RequestDto>(); config.CreateMap<InnerSource, InnerSourceDto>(); config.CreateMap<Request, InnerSourceDto>().IncludeMembers(src => src.InnerSource); }, typeof(Program)); // 或者单独调用验证 _mapper.ConfigurationProvider.AssertConfigurationIsValid();
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

