C# AutoMapper:使用多个IValueResolver时调用Resolve()的顺序
我正在使用AutoMapper,我声明了一个映射规则,如下所示:C# AutoMapper:使用多个IValueResolver时调用Resolve()的顺序,c#,automapper,resolver,C#,Automapper,Resolver,我正在使用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(d
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>())
CreateMap()
.ForMember(dest=>dest.Id,opt=>opt.MapFrom(src=>src.Id))
.ForMember(dest=>dest.ActivityName,opt=>opt.MapFrom(src=>src.Name))
.FormMember(dest=>dest.Name,opt=>opt.MapFrom())
.FormMember(dest=>dest.HistName,opt=>opt.MapFrom())
.FormMember(dest=>dest.Asset,opt=>opt.MapFrom())
.FormMember(dest=>dest.Props,opt=>opt.MapFrom())
我正在为此规则编写单元测试,但我很难理解调用解析器的顺序(调用它们的Resolve()
方法的顺序)
我为namesolver
编写了一个单元测试,并认为它将是第一个调用Resolve()
方法的解析器。调试时我发现我错了。调用的第一个解析器是AssetResolver
“哦,好吧!我猜解析器是按字母顺序处理的。”我想。我又错了。调试表明,顺序解析程序是通过其Resolve()
方法调用的:
AssetResolver
->namesolver
->histnamesolver
->PropsResolver
AssetResolver
移动到队列的前面,而其余的解析程序则按照在映射规则上声明的顺序进行“处理”。我不明白为什么要按这个顺序调用它们。有人能解释一下吗?我能以任何方式更改订单吗?谢谢大家! 您可以通过调用SetMappingOrder(int)
进行配置
例如:
CreateMap<Foo, Bar>()
.ForMember(dest => dest.Name, opt =>
{
opt.MapFrom<NameResolver>();
opt.SetMappingOrder(5);
}
CreateMap()
.ForMember(dest=>dest.Name,opt=>
{
opt.MapFrom();
选择设置映射顺序(5);
}
虽然我也会考虑Lucian Bargaoanu关于使用类型转换器的评论。这里有太多的解析器。编写自定义类型转换器似乎更容易,然后顺序很明显。“Lucian Bargaoanu谢谢你的建议。我提议,我感谢你抽出时间来帮助我,并给我提供了一个方法。”设置映射顺序。但是您知道在没有明确定义映射顺序时,分配映射顺序的“默认”方式是什么吗?这是未定义的。默认情况下,没有顺序。