繁体   English   中英

AutoMapper:PreserveReferences和MaxDepth有什么区别?

[英]AutoMapper: What is the difference between PreserveReferences and MaxDepth?

我有点困惑。 我找不到PreserveReferencesMaxDepth之间的区别。

假设我们有以下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);

这就是我期望得到的:

在此处输入图片说明

那就是我真正得到的:

在此处输入图片说明

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

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

PreserveReferencesProjectTo MaxDepthMaxDepth 如果使用Map ,以某种方式,您有一个可能会在堆栈中溢出的映射树,但是对象实例没有重复,那么PreserveReferences将无济于事, MaxDepth将会帮助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<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级深度开始,我们将为InnerSelfModel获得null

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM