首页 > 解决方案 > AutoMapper:使用多个 IValueResolver 时 Resolve() 的调用顺序

问题描述

我正在使用 AutoMapper,并声明了一个映射规则,如下所示:

   CreateMap<Foo, Bar>()
      .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.ID))
      .ForMember(dest => dest.ActivityName, opt => opt.MapFrom(src => src.Name))
      .ForMember(dest => dest.Name, opt => opt.MapFrom<NameResolver>())
      .ForMember(dest => dest.HistName, opt => opt.MapFrom<HistNameResolver>())
      .ForMember(dest => dest.Asset, opt => opt.MapFrom<AssetResolver>())
      .ForMember(dest => dest.Props, opt => opt.MapFrom<PropsResolver>())

我正在为此规则编写单元测试,但我无法理解调用解析器的顺序(调用其Resolve()方法的顺序)。

我为它编写了一个单元测试,NameResolver并认为它将是第一个Resolve()将调用其方法的解析器。在调试时我发现我错了。调用的第一个解析器是AssetResolver.

“哦,好吧!我猜解析器是按字母顺序处理的。” 我想。我又错了。调试显示订单解析器是通过他们的Resolve()方法调用的:

AssetResolver-> NameResolver-> HistNameResolver->PropsResolver

AssetResolver移动到队列的前面,而其余的解析器按照它们在映射规则中声明的顺序进行“处理”。我不明白为什么按此顺序调用它们。任何人都可以对此有所了解吗?我可以以任何方式更改此订单吗?谢谢!

标签: c#automapperresolver

解决方案


您可以通过调用来配置它SetMappingOrder(int)

例如:

CreateMap<Foo, Bar>()
    .ForMember(dest => dest.Name, opt => 
    {
        opt.MapFrom<NameResolver>();
        opt.SetMappingOrder(5);
    }

虽然我也会考虑 Lucian Bargaoanu 关于使用类型转换器的评论。


推荐阅读