dan*_*wig 51 automapper automapper-2
忽略ResolveUsing采用IValueResolver 的重载,并仅查看这两种方法:
void ResolveUsing(Func<TSource, object> resolver);
void MapFrom<TMember>(Expression<Func<TSource, TMember>> sourceMember);
Run Code Online (Sandbox Code Playgroud)
这两者之间的主要区别似乎是ResolveUsinga Func<TSource, object>,而MapFrom需要a Expression<Func<TSource, TMember>>.
但是,在实际上使用lambda表达式的这些方法之一的客户端代码中,它们似乎是可互换的:
Mapper.CreateMap<SourceType, DestType>() // uses ResolveUsing
.ForMember(d => d.DestPropX, o => o.ResolveUsing(s => s.SourcePropY));
Mapper.CreateMap<SourceType, DestType>() // uses MapFrom
.ForMember(d => d.DestPropX, o => o.MapFrom(s => s.SourcePropY));
Run Code Online (Sandbox Code Playgroud)
那么上述两种选择之间最终的区别是什么呢?一个比另一个快吗?一个是比另一个更好的选择,如果是,何时/为什么?
Sun*_*nov 64
在过去,我与Automapper的作者在邮件列表上进行了长时间的电子邮件交换.MapFrom将通过表达式一直进行空检查:
所以你可以这样做
opt => opt.MapFrom(src => src.SomeProp.Way.Down.Here.Somewhere),每个级别都会检查空值(因为它已经用于展平).
Geo*_*der 19
我刚刚使用新的C#6 null条件运算符做了一些基准测试 ?.
请考虑以下场景:class A有一个子类B,它有一个子节点C,Name我们希望将其属性展平为DTO.我测试了两个变种:
// using mapfrom
CreateMap<MapFromA, MapFromADto>()
.ForMember(dto => dto.Name, o => o.MapFrom(a => a.B.C.Name));
// using resolveusing with elvis
CreateMap<ResolveUsingX, ResolveUsingXDto>()
.ForMember(dto => dto.Name, o => o.ResolveUsing(x => x.Y?.Z?.Name));
Run Code Online (Sandbox Code Playgroud)
我打电话_mapper.Map<ResolveUsingXDto>(x);或者_mapper.Map<MapFromADto>(a);1000个不同ResolveUsingX x,MapFromA a并且花时间使用了System.Diagnostics.StopWatch.这是我的结果:
Distinct elements per batch: 1000; # batches for average: 25
A->B->C.Name, C is never null.
MapForm - average time taken for 1000x: 5527,84 ticks = 1,44 ms.
ResolveUsing - average time taken for 1000x: 5479,76 ticks = 1,4 ms.
A->B->C.Name, C is null 1/3 of the time.
MapForm - average time taken for 1000x: 72924,4 ticks = 27,44 ms.
ResolveUsing - average time taken for 1000x: 5351,2 ticks = 1,48 ms.
A->B->C.Name, C is null 1/2 of the time.
MapForm - average time taken for 1000x: 107016,92 ticks = 40,52 ms.
ResolveUsing - average time taken for 1000x: 5835,32 ticks = 1,56 ms.
A->B->C.Name, C is null 2/3 of the time.
MapForm - average time taken for 1000x: 141437,96 ticks = 53,64 ms.
ResolveUsing - average time taken for 1000x: 5789,72 ticks = 1,56 ms.
Run Code Online (Sandbox Code Playgroud)
MapFrom必须捕获NullReferenceExceptions,这比ResolveUsing使用elvis运算符慢?.
| 归档时间: |
|
| 查看次数: |
28699 次 |
| 最近记录: |