簡體   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