c# - 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
移动到队列的前面,而其余的解析器按照它们在映射规则中声明的顺序进行“处理”。我不明白为什么按此顺序调用它们。任何人都可以对此有所了解吗?我可以以任何方式更改此订单吗?谢谢!
解决方案
您可以通过调用来配置它SetMappingOrder(int)
。
例如:
CreateMap<Foo, Bar>()
.ForMember(dest => dest.Name, opt =>
{
opt.MapFrom<NameResolver>();
opt.SetMappingOrder(5);
}
虽然我也会考虑 Lucian Bargaoanu 关于使用类型转换器的评论。
推荐阅读
- angular - TypeScript 编译中缺少 main.tns.ts。从 Angular 迁移到 Nativescript
- machine-code - 您如何在 gforth 中编译和执行机器代码?
- python - 使用 Python Enum 或 Dictionary 映射常量并保持 DRY 推理的最佳方式
- python - Google Kickstart Truck Delivery 部分正确答案
- c - Win32 API - 使用 TextOut 在工具栏的空白区域上绘图
- vue.js - VUE.JS 中的 WebGL Earth 或 globe.gl
- python - 使用 Python 发送电子邮件实用程序在 python3 中添加额外的字符(!)
- python - 如何使局部变量在其他函数中工作(Python)
- javascript - 随机数仅在 HTML 和 Javascript 中显示 0
- php - php页面中的非法字符串偏移警告