我的任务是将代码库从使用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);
}
然而,由于我们一开始并不太清楚它在做什么,所以很难说这是正确的还是我应该在改变之后测试的内容。
因此我的问题是双重的:
答案 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);