今天,我将一个使用 AutoMapper v1.1 的全功能应用程序升级到现在使用 AutoMapper v2.1,但我遇到了一些使用以前版本时从未遇到的问题。
以下是我的代码映射的例子 Dto 到 領域 对象
public class TypeOne
{
public TypeOne()
{
}
public TypeOne(TypeTwo two)
{
//throw ex if two is null
}
public TypeOne(TypeTwo two, TypeThree three)
{
//throw ex if two or three are null
}
public TypeTwo Two {get; private set;}
public TypeThree Three {get; private set;}
}
public class TypeOneDto
{
public TypeOneDto()
{
}
public TypeTwoDto Two {get; set;}
public TypeThreeDto Three {get; set;}
}
...
Mapper.CreateMap<TypeThreeDto, TypeThree>();
Mapper.CreateMap<TypeTwoDto, TypeTwo>();
Mapper.CreateMap<TypeOneDto, TypeOne>();
var typeOne = Mapper.Map<TypeOne>(typeOneDto);
然而,我在使用v2.1时遇到的第一个问题是,AutoMapper试图使用2个args的构造函数,而其中一个args是空的,应该使用1个args的构造函数。
然后我尝试使用
Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing(x => new TypeOne());
但我一直收到一个'模糊调用'的错误,我无法解决。
然后我尝试了
Mapper.CreateMap<TypeOneDto, TypeOne>().ConvertUsing(x => new TypeOne());
并成功地使用无参数构造函数创建了TypeOne对象,但却无法设置私有的setter属性。
我在AutoMapper网站上找过帮助,也下载了源码好好看了看,但是没有得到太多关于文档的帮助,而且ConstructUsing的单元测试也不多。
我有没有什么明显的遗漏,我应该用v2.1来改变?我很惊讶,它与v1.1相比有这么大的变化。
您只需要添加 明投 到
Func<ResolutionContext, TypeOne>
下面是代码。
Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing(
(Func<ResolutionContext, TypeOne>) (r => new TypeOne()));
当前版本的AutoMapper工作原理如下所述。
按参数数量对目标类型构造函数进行排序
destTypeInfo.GetConstructors().OrderByDescending(ci => ci.GetParameters().Length);
取第一个参数与源属性相匹配的构造函数(不检查空值)。在你的例子中,它是一个有两个参数的构造函数。
这里有一个扩展方法...
public static void CreateMapWithDefaultConstructor<T, TU>(this Profile profile)
where TU : class, new()
{
profile.CreateMap<T, TU>().ConstructUsing(source => new TU());
}