AutoMapper 9.0映射异常排查:WCF+Autofac环境下缺失类型映射配置
这个问题的核心原因很明确——你当前的AutoMapper配置只定义了数据层模型到服务层模型的映射,但代码中需要的是服务层请求模型到数据层模型的反向映射,同时我们也需要确认Autofac是否正确加载了你的Profile配置。
下面是分步解决方案:
1. 补充缺失的映射配置
你的GetProposalListRequestProfile中只创建了Data.Models.getProposalListRequest → getProposalListRequest的映射,但在GetProposalList方法中,你首先需要的是getProposalListRequest → Data.Models.getProposalListRequest的映射,这就是抛出异常的直接原因。
你有两种方式修复:
方式一:使用ReverseMap()自动生成双向映射
这种方式最简单,会基于已有的映射规则自动生成反向映射:
public class GetProposalListRequestProfile : Profile { public GetProposalListRequestProfile() { // 配置数据层到服务层的映射,并自动生成反向映射 CreateMap<Data.Models.getProposalListRequest, getProposalListRequest>() .ForMember(dest => dest.getProposalList, opt => opt.MapFrom(src => src.getProposalList)) .ReverseMap(); // 关键:添加这一行来生成服务层到数据层的映射 // 别忘了同时添加响应模型的双向映射! CreateMap<Data.Models.getProposalListResponse, getProposalListResponse>() .ReverseMap(); } }
方式二:手动添加反向映射
如果你需要对反向映射做单独的规则配置,可以手动创建:
public class GetProposalListRequestProfile : Profile { public GetProposalListRequestProfile() { // 数据层 → 服务层 CreateMap<Data.Models.getProposalListRequest, getProposalListRequest>() .ForMember(dest => dest.getProposalList, opt => opt.MapFrom(src => src.getProposalList)); // 服务层 → 数据层(手动添加) CreateMap<getProposalListRequest, Data.Models.getProposalListRequest>() .ForMember(dest => dest.getProposalList, opt => opt.MapFrom(src => src.getProposalList)); // 响应模型的双向映射 CreateMap<Data.Models.getProposalListResponse, getProposalListResponse>(); CreateMap<getProposalListResponse, Data.Models.getProposalListResponse>(); } }
2. 确认Autofac配置的正确性
你的Autofac配置整体是合理的,但需要注意两个细节:
- 确保所有的
Profile都被正确注册:你已经注册了GetProposalListRequestProfile,如果后续有其他Profile,也要用builder.RegisterType<XXProfile>().As<Profile>()的方式注册。 MapperConfiguration的SingleInstance注册是正确的,因为AutoMapper的配置只需要初始化一次;IMapper的InstancePerLifetimeScope也适合WCF场景,每个请求会获取独立的Mapper实例。
可以在Application_Start末尾添加验证代码,提前排查配置问题:
var container = builder.Build(); AutofacHostFactory.Container = container; // 验证AutoMapper配置是否有效 var mapperConfig = container.Resolve<MapperConfiguration>(); try { mapperConfig.AssertConfigurationIsValid(); // 也可以单独检查特定映射是否存在 var requestMapExists = mapperConfig.FindTypeMapFor<getProposalListRequest, Data.Models.getProposalListRequest>() != null; var responseMapExists = mapperConfig.FindTypeMapFor<Data.Models.getProposalListResponse, getProposalListResponse>() != null; Debug.WriteLine($"Request map exists: {requestMapExists}, Response map exists: {responseMapExists}"); } catch (AutoMapperConfigurationException ex) { Debug.WriteLine($"AutoMapper配置错误:{ex.Message}"); throw; }
3. 确认WCF服务的依赖注入生效
确保你的WCF服务是通过Autofac的宿主来托管的,比如在.svc文件中指定Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf",这样Autofac才能正确注入IMapper和IProposalContext。
完成以上步骤后,再次运行服务,Missing type map configuration的异常应该就能解决了。
内容的提问来源于stack exchange,提问作者Simon Price

