我有点困惑。我无法找出PreserveReferences
和MaxDepth
之间的区别。
假设我们有以下DTO和模型。
public class PersonEntity
{
public PersonEntity InnerPerson { get; set; }
}
public class PersonModel
{
public PersonModel InnerPerson { get; set; }
}
如文档中所述:
以前,AutoMapper可以通过保持来处理循环引用 跟踪映射的内容,并在每个映射上检查本地 源/目标对象的哈希表,以查看该项是否已经存在 映射。事实证明,这种追踪非常昂贵,而且你需要 使用PreserveReferences选择使用圆形地图。 或者,您可以配置MaxDepth。
我的映射:
cfg.CreateMap<PersonModel, PersonEntity>().MaxDepth(1);
cfg.CreateMap<PersonEntity, PersonModel>();
程序:
var personModel = new PersonModel();
personModel.InnerPerson = personModel;
var entity = Mapper.Map<PersonEntity>(personModel);
这是我期望得到的:
这就是我实际得到的:
我可以使用它们(PreserveReferences
和MaxDepth
)来解析循环引用,但我不会看到差异。当我在MaxDepth
方法中使用不同的深度时?那么,有人能提供吗?提前致谢。
答案 0 :(得分:4)
MaxDepth
在运行时不考虑对象值。它只是在映射树的深度达到配置值后停止映射。
PreserveReferences
对ProjectTo
,MaxDepth
没有帮助。如果以某种方式,使用Map
,您有一个可能会溢出堆栈的映射树,但对象实例不会重复,那么PreserveReferences
将无法帮助,MaxDepth
将会有所帮助。
MaxDepth
是可预测的,它在硬编码值处停止,PreserveReferences
仅在重复对象实例时停止。
答案 1 :(得分:1)
感谢@Lucian Bargaoanu的回答。我只想添加MaxDepth
的简单示例。
我最近改变了我的DTO和模型。
public class SelfEntity
{
public string Id { get; set; }
public string Name { get; set; }
public int Number;
public SelfEntity InnerSelfEntity { get; set; }
}
public class SelfModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public int Number;
public SelfModel InnerSelfModel { get; set; }
}
映射:
cfg.CreateMap<SelfModel, SelfEntity>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(x => x.Id.ToString()))
.MaxDepth(3);
计划:
SelfModel firstSelfModel = new SelfModel();
SelfModel prev = firstSelfModel;
for (int i = 0; i < 100; i++)
{
SelfModel newModel = new SelfModel
{
Id = Guid.NewGuid(),
Name = "Test name" + i.ToString(),
Number = i
};
prev.InnerFirstSelf = newModel;
prev = newModel;
}
var entity = Mapper.Map<FirstSelfEntity>(firstSelfModel);
从第3级深度开始,我们将null
获得InnerSelfModel
。
PreserveReferences对ProjectTo没有帮助,MaxDepth确实如此。如果 不知何故,使用Map,你有一个可能溢出的映射树 然后,堆栈,但对象实例不重复 PreserveReferences不会有帮助,MaxDepth会。