AutoMapper,尝试并捕获映射

时间:2015-02-19 09:28:44

标签: c# exception try-catch automapper

我已经创建了一个地图,但是..一些源属性会不时抛出一个异常(不要问我为什么有人决定使“get”抛出异常,如果它的null ...但是。 。) 当AutoMapper尝试映射属性时,这会导致一些问题,无论如何尝试在映射中捕获异常,如果它进入缓存,那么只需为目标属性分配一个默认值?

BR, Inx

1 个答案:

答案 0 :(得分:3)

您是否考虑过

Automapper.Mapper.CreateMap<Source,Dest>().BeforeMap(Action<Source, Dest> beforeMapAction)`

来自https://github.com/AutoMapper/AutoMapper/wiki/Before-and-after-map-actions

  

有时,您可能需要在地图发生之前或之后执行自定义逻辑。这些应该是罕见的,因为在AutoMapper之外进行这项工作更为明显。您可以在地图操作之前/之后创建全局:

Mapper.CreateMap<Source, Dest>()
.BeforeMap((src, dest) => src.Value = src.Value + 10)
.AfterMap((src, dest) => dest.Name = "John");
     

或者您可以在映射期间创建地图回调之前/之后:

int i = 10;
Mapper.Map<Source, Dest>(src, opt => {
opt.BeforeMap((src, dest) => src.Value = src.Value + i);
opt.AfterMap((src, dest) => dest.Name = HttpContext.Current.Identity.Name);
});
     

当您需要在地图操作之前/之后输入上下文信息时,后一种配置很有用。

首先,您必须将您的属性添加到忽略列表,然后在map之前使用。

AutoMapper.Mapper.CreateMap<Source,Dest>().
ForMember((src => src.PropertyWithException), opt => opt.Ignore()).
BeforeMap((src,dest)=>
{
    try
    {
        dest.PropertyWithException = src.PropertyWithException;
    }
    catch
    {
        dest.PropertyWithException = some_default_value;
    }
});