AutoMapper:PreserveReferences和MaxDepth有什么区别?

时间:2018-02-16 10:03:15

标签: c# automapper circular-reference

我有点困惑。我无法找出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);

这是我期望得到的:

enter image description here

这就是我实际得到的:

enter image description here

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

2 个答案:

答案 0 :(得分:4)

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

PreserveReferencesProjectToMaxDepth没有帮助。如果以某种方式,使用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会。