【问题标题】:AutoMapper 9.0 : AutoMapperMappingException: 'Missing type map configuration or unsupported mapping.'AutoMapper 9.0:AutoMapperMappingException:“缺少类型映射配置或不支持的映射。”
【发布时间】:2020-06-09 20:11:47
【问题描述】:

我正在使用 WCF 服务并已使用 AutoFac 设置 DI,并且还希望使用 automapper。我相信我的注入是正确的,因为当我进入希望调用的服务时,我可以看到我的配置。

在我的 global.asax 文件中,我有这个配置;

protected void Application_Start(object sender, EventArgs e)
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<ProposalService>().As<IProposalService>();
        builder.RegisterType<ProposalListService>().As<IProposalListService>();
        builder.RegisterType<ProposalContext>().As<IProposalContext>();
        builder.RegisterType<GetProposalListRequestProfile>().As<Profile>();
        builder.Register(c => new MapperConfiguration(cfg =>
        {
            foreach (var profile in c.Resolve<IEnumerable<Profile>>())
            {
                cfg.AddProfile(profile);
            }

        })).AsSelf().SingleInstance();

        builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve)).As<IMapper>().InstancePerLifetimeScope();


        AutofacHostFactory.Container = builder.Build();
    }

在我不想使用的服务中,我有这个

public class ProposalListService : IProposalListService
{
    private IProposalContext _proposalContext;
    private IMapper _mapper;

    public ProposalListService(IProposalContext proposlContext, IMapper mapper)
    {
        _proposalContext = proposlContext;
        _mapper = mapper;
    }

    public getProposalListResponse GetProposalList(getProposalListRequest request)
    {
        var mappedRequest = _mapper.Map<getProposalListRequest, Data.Models.getProposalListRequest>(request);
        var result = _proposalContext.GetProposalList(mappedRequest);
        var mappedResponse = _mapper.Map<Data.Models.getProposalListResponse, getProposalListResponse>(result);
        return mappedResponse;
    }
}

我有这个映射配置文件

public class GetProposalListRequestProfile : Profile
{
    public GetProposalListRequestProfile()
    {
        IMappingExpression<Data.Models.getProposalListRequest, getProposalListRequest>
            mappingExpression =
                CreateMap<Data.Models.getProposalListRequest, getProposalListRequest>()
                    .ForMember(dest => dest.getProposalList, opt => opt.MapFrom(src => src.getProposalList));

    }
}

结构是

WCF 服务正在访问一个类库,然后将调用 EF 来获取数据,但是当我到达var mappedRequest = _mapper.Map&lt;getProposalListRequest, Data.Models.getProposalListRequest&gt;(request); 行时,我得到了错误

AutoMapper.AutoMapperMappingException: '缺少类型映射配置或不支持的映射。'

对于解决此问题的任何和所有帮助,我将不胜感激。

谢谢

【问题讨论】:

  • 您已经从Data.Models.getProposalListRequest 映射到getProposalListRequest,但反之则不然。如果要双向绘制地图,则需要为两个方向创建地图。
  • @Charleh 我都试过了,把它们换成圆形和反向地图,仍然遇到同样的问题

标签: c# .net automapper


【解决方案1】:

如果您检查CreateMap 方法,您将看到下一个:

IMappingExpression<TSource, TDestination> CreateMap<TSource, TDestination>();

因此,您的 CreateMap&lt;Data.Models.getProposalListRequest, getProposalListRequest&gt;() 将创建从 Data.Models.getProposalListRequestgetProposalListRequest 的映射,以便处理您的用例,您将添加恢复的注册或尝试在 CreateMap 之后添加 .ReverseMap() 调用。

【讨论】:

  • 在 MapperConfiguration 注册中设置断点并检查是否实际找到任何配置文件。然后检查IMapper注册。
  • @SimonPrice 我也将映射器本身注册为单个实例并手动创建配置:builder.Register(c =&gt; new MapperConfiguration(cfg =&gt; cfg.AddProfiles(new [] {new GetProposalListRequestProfile()})).CreateMapper() ).As&lt;IMapper&gt;().SingleInstance()
  • 您能否提供一个更完整的示例来说明您的意思,因为我怀疑我将创建大量映射,因为我们刚刚接管的 WSDL 文件有 259 个可能需要映射的类
  • @SimonPrice 您当前的方法只会生成更多代码来注册所有映射。您可以尝试使用assembly scanning 来注册来自程序集的配置文件,而不是手动。
猜你喜欢
  • 2016-11-26
  • 1970-01-01
  • 2019-03-01
  • 2017-04-16
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
相关资源
最近更新 更多