AutoMapper:PreserveReferences和MaxDepth有什么区别?

我有点困惑。 我无法找出PreserveReferencesMaxDepth之间的区别。

假设我们有以下DTO和模型。

 public class PersonEntity { public PersonEntity InnerPerson { get; set; } } public class PersonModel { public PersonModel InnerPerson { get; set; } } 

如文档中所述:

以前,AutoMapper可以通过跟踪映射的内容来处理循环引用,并在每个映射上检查源/目标对象的本地哈希表,以查看该项是否已映射。 事实certificate,这种跟踪非常昂贵,您需要使用PreserveReferences选择使用圆形贴图才能工作。 或者,您可以配置MaxDepth。

我的映射:

 cfg.CreateMap().MaxDepth(1); cfg.CreateMap(); 

程序:

 var personModel = new PersonModel(); personModel.InnerPerson = personModel; var entity = Mapper.Map(personModel); 

这就是我期望得到的:

在此处输入图像描述

这就是我实际得到的:

在此处输入图像描述

我可以使用它们( PreserveReferencesMaxDepth )来解析循环引用,但我没有看到区别。 什么时候我应该在MaxDepth方法中使用不同的深度? 那么,有人能提供吗? 提前致谢。

MaxDepth在运行时不考虑对象值。 它只是在映射树的深度达到配置值后停止映射。

PreserveReferencesProjectTo没有帮助, MaxDepth也没有。 如果以某种方式,使用Map ,您有一个可能会溢出堆栈的映射树,但是对象实例不会重复,那么PreserveReferences将无济于事, MaxDepth将会有所帮助。

MaxDepth是可预测的,它在硬编码值处停止, PreserveReferences仅在重复对象实例时停止。

谢谢@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() .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(firstSelfModel); 

从第3级深度开始,我们将为InnerSelfModel获取null

PreserveReferences对ProjectTo没有帮助,MaxDepth也没有。 如果以某种方式,使用Map,您有一个可能会溢出堆栈的映射树,但是对象实例不会重复,那么PreserveReferences将无济于事,MaxDepth将会有所帮助。