Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AutoMapper:使用多个IValueResolver时调用Resolve()的顺序_C#_Automapper_Resolver - Fatal编程技术网

C# AutoMapper:使用多个IValueResolver时调用Resolve()的顺序

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

我正在使用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>())
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谢谢你的建议。我提议,我感谢你抽出时间来帮助我,并给我提供了一个方法。”设置映射顺序。但是您知道在没有明确定义映射顺序时,分配映射顺序的“默认”方式是什么吗?这是未定义的。默认情况下,没有顺序。