自动映射器 - 多次调用CreateMap

14

当我使用Mapper.CreateMap多次调用相同类型时会发生什么?

它是否会覆盖先前的映射?如果是这样,是否有可能在尝试创建已经创建的映射时抛出异常?

1个回答

24

如果多次调用相同源和目标的Mapper.CreateMap<TSource, TDestination>(),则不会发生任何事情,因为它不会为映射配置设置任何扩展。 如果像这样设置IMappingExpression的覆盖: Mapper.CreateMap<TSource, TDestination>().ConstructUsing(x=>new TDestination(x.SomeField)), 那么是的,此映射的配置将被替换为新的配置。 关于您问题的第二部分,我知道验证映射是否已经创建的方法:

public TDestination Resolve<TSource, TDestination>(TSource source)
{
     var mapped = Mapper.FindTypeMapFor(typeof(TSource), typeof(TDestination)); //this will give you a reference to existing mapping if it was created or NULL if not

     if (mapped == null)
     {
        var expression = Mapper.CreateMap<TSource, TDestination>();
     }
     return Mapper.Map<TSource, TDestination>(source);
}

有点晚了,但我相信它回答了这个问题。 - Euphoric
6
重复调用会有额外开销吗?比如说如果它在类的构造函数中? - Baahubali
2
非常晚的回复,但为了任何其他阅读者的利益,是的!我目前正在查看一份性能报告,其中60%的CPU时间用于调用Mapper.CreateMap(带有像上面答案中的扩展) - Talonj
@Talonj - 预计调用CreateMap会有很高的开销,但如果FindTypeMapFor(...)返回一个现有的映射,则不应重复调用CreateMap。 - Ben Randall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接