将AutoMapper扩展方法从v3更新为v5

时间:2016-11-23 13:07:40

标签: c# automapper

我的任务是将代码库从使用Automapper 3.3升级到5.1。到目前为止一切顺利,除了定义的扩展方法不再有效。编写(或复制?)这种方法的人不再在这里工作,没有人可以解释他们应该做什么,这使得很难更新。

    public static void IgnoreIfSourceIsNull<T>(this IMemberConfigurationExpression<T> expression)
    {
        expression.Condition(IgnoreIfSourceIsNull);
    }

    private static bool IgnoreIfSourceIsNull(ResolutionContext context)
    {
        if (!context.IsSourceValueNull)  // A
            return true;

        var result = context.GetContextPropertyMap().ResolveValue(context.Parent);
        return result.Value != null; //B
    }

然后使用:

调用

Mapper.CreateMap<TypeA,TypeB>().ForAllMembers(opt => opt.IgnoreIfSourceIsNull());

这在AutoMapper 5中不再有效。除了IMemberConfigurationExpression界面已更改之外,我遇到的问题是ResolutionContext不再包含IsSourceValueNull属性,也不包含Parent {1}}财产。我不确定这种方法应该做什么。我认为它忽略了属性,如果A.属性值为null或B.父对象为null。

一个。我明白; B.对我来说没有那么大的意义(如果父对象为null,为什么我们仍然会映射这个特定的属性?)因此很难将其转换为可以在版本5中调用的东西。

我的最佳猜测如何更新这个:

    public static void IgnoreIfSourceIsNull<TSource,TDestination,TMember>(this IMemberConfigurationExpression<TSource,TDestination,TMember> expression)
    {
        // either this
        expression.Condition(c => c != null);
        // or this
        expression.Condition((src,dest,sMember,dMember) => sMember != null && src != null);
    }

然而,由于我们一开始并不太清楚它在做什么,所以很难说这是正确的还是我应该在改变之后测试的内容。

因此我的问题是双重的:

  1. 完全这是做什么的?
  2. 如何在Automapper 5中使用它?

1 个答案:

答案 0 :(得分:3)

我想我理解所期望的行为是什么。您将从TypeA objA开始,其中一些值已经填充,然后使用automapper更新项目,IFF源属性不为null。

在提交ad5d39

中删除了IsSourceValueNull属性

在Automapper 5中,有unit test可以完全满足您的需求。

cfg.CreateMap<Source, Dest>()
   .ForAllMembers(opt => opt.Condition((src, dest, srcVal, destVal, c) => srcVal != null));

澄清有关src != null的评论:

if(null == newValueInstance) {
    // throw new CustomException("newObject should not be null")
    // Or just return the existing object unchanged.
    return existingObject;
}
return Mapper.Map(newValueInstance, existingObject);