AutoMapper:PreserveReferences和MaxDepth有什么区别?

Jos*_*man 5 c# circular-reference automapper

我有点困惑.我无法找出PreserveReferences和之间的区别MaxDepth.

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

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

public class PersonModel
{
    public PersonModel InnerPerson { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如文档中所述:

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

我的映射:

cfg.CreateMap<PersonModel, PersonEntity>().MaxDepth(1);
cfg.CreateMap<PersonEntity, PersonModel>();
Run Code Online (Sandbox Code Playgroud)

程序:

var personModel = new PersonModel();
personModel.InnerPerson = personModel;
var entity = Mapper.Map<PersonEntity>(personModel);
Run Code Online (Sandbox Code Playgroud)

这就是我期望得到的:

在此输入图像描述

这就是我实际得到的:

在此输入图像描述

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

Luc*_*anu 5

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

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

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