【问题标题】:AutoMapper,try and catch mappingAutoMapper,尝试并捕获映射
【发布时间】:2015-02-19 09:28:44
【问题描述】:

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

兄弟, 英克斯

【问题讨论】:

    标签: c# exception try-catch automapper


    【解决方案1】:

    你考虑过

    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);
    });
    

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

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

    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;
        }
    });
    

    【讨论】:

    • 嗯.. 我不太清楚如何使用它.. 你的意思是我可以通过 .BeforeMap 中的操作将当前引发异常的属性的值设置为默认值-method.. 然后像往常一样链接一堆 ForMember?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2014-06-30
    相关资源
    最近更新 更多