AutoMapper:PreserveReferences和MaxDepth有什么区别?
我有点困惑。 我无法找出PreserveReferences
和MaxDepth
之间的区别。
假设我们有以下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);
这就是我期望得到的:
这就是我实际得到的:
我可以使用它们( PreserveReferences
和MaxDepth
)来解析循环引用,但我没有看到区别。 什么时候我应该在MaxDepth
方法中使用不同的深度? 那么,有人能提供吗? 提前致谢。
MaxDepth
在运行时不考虑对象值。 它只是在映射树的深度达到配置值后停止映射。
PreserveReferences
对ProjectTo
没有帮助, 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将会有所帮助。