【发布时间】:2016-08-16 22:45:49
【问题描述】:
我有一个源对象,其中包含对同一集合的 2 个引用。如果我将源类型映射到结构等效的目标类型,AutoMapper 将在目标实例中创建集合的两个实例。
class SourceThing
{
public string Name { get; set; }
public List<int> Numbers { get; set; }
public List<int> MoreNumbers { get; set; }
}
class TargetThing
{
public string Name { get; set; }
public List<int> Numbers { get; set; }
public List<int> MoreNumbers { get; set; }
}
如果我创建一个SourceThing,它有两个对同一个列表的引用,将它映射到一个TargetThing,结果是一个TargetThing,它有两个单独的集合实例。
public void MapObjectWithTwoReferencesToSameList()
{
Mapper.CreateMap<SourceThing, TargetThing>();
//Mapper.CreateMap<List<int>, List<int>>(); // passes when mapping here
var source = new SourceThing() { Name = "source" };
source.Numbers = new List<int>() { 1, 2, 3 };
source.MoreNumbers = source.Numbers;
Assert.AreSame(source.Numbers, source.MoreNumbers);
var target = Mapper.Map<TargetThing>(source);
Assert.IsNotNull(target.Numbers);
Assert.AreSame(target.Numbers, target.MoreNumbers); // fails
}
这是否意味着 AutoMapper 中具体集合的默认映射行为?通过测试,我意识到如果我将List<int>映射到List<int>,我实现了我想要的行为,但我不明白为什么。如果 AutoMapper 跟踪引用并且不重新映射映射对象,它不会看到 source.MoreNumbers 指向与 source.Numbers 相同的列表,并相应地设置目标吗?
【问题讨论】:
-
听起来您遇到了与 Stack Overflow 问题中描述的相同的问题:AutoMapper, how to keep references between mapped objects?。他们使用自定义 ITypeConverter 解决了这个问题。听起来这在您的场景中可能需要做很多工作(如果您必须为许多课程这样做)。
-
它是相关的,但他的问题是关于跨 多个 映射操作保留引用,而我的问题是在单个 map() 中。这不是 AutoMapper 的意图,当每个 Mapper.Map() 调用仅依赖于静态映射配置时,怎么可能?
标签: c# .net automapper automapper-3