You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AutoMapper 9.0映射异常排查:WCF+Autofac环境下缺失类型映射配置

解决AutoMapper Missing Type Map Configuration异常的问题

这个问题的核心原因很明确——你当前的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:27:29