AutoMapper: Quelle est la différence entre PreserveReferences et MaxDepth?

Je suis un peu confuse. Je ne trouve pas la différence entre PreserveReferences et MaxDepth .

Supposons que nous ayons les DTO et modèles suivants.

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

Comme écrit dans la documentation:

Auparavant, AutoMapper pouvait gérer les références circulaires en gardant une trace de ce qui était mappé et, sur chaque mappage, vérifier une table de hachage locale d’objects source / destination pour voir si l’élément était déjà mappé. Il s’avère que ce suivi coûte très cher et que vous devez choisir d’utiliser PreserveReferences pour que les cartes circulaires fonctionnent. Vous pouvez également configurer MaxDepth.

Mes mappages:

 cfg.CreateMap().MaxDepth(1); cfg.CreateMap(); 

Programme:

 var personModel = new PersonModel(); personModel.InnerPerson = personModel; var entity = Mapper.Map(personModel); 

C’est ce que je m’attends à obtenir:

entrez la description de l'image ici

C’est ce que je reçois réellement:

entrez la description de l'image ici

Je peux utiliser les deux ( PreserveReferences et MaxDepth ) pour résoudre des références circulaires, mais je ne vois pas la différence. Quand devrais-je utiliser un nombre différent de profondeur dans la méthode MaxDepth ? Alors, quelqu’un pourrait-il le fournir? Merci d’avance.

MaxDepth ne considère pas les valeurs d’object au moment de l’exécution. Il arrête simplement le mappage lorsque la profondeur de l’arbre de mappage atteint la valeur configurée.

PreserveReferences n’aide pas ProjectTo , MaxDepth ne l’a pas. Si, d’une manière ou d’une autre, avec Map , vous avez un arbre de mappage qui peut déborder de la stack, mais que les instances d’objects ne sont pas dupliquées, alors PreserveReferences ne vous aidera pas, MaxDepth fera.

MaxDepth est prévisible, il s’arrête à une valeur codée en dur, PreserveReferences ne s’arrête que lorsqu’une instance d’object est dupliquée.

Merci @Lucian Bargaoanu pour la réponse. Je veux juste append un exemple simple de MaxDepth .

J’ai récemment changé de DTO et de modèle.

 public class SelfEntity { public ssortingng Id { get; set; } public ssortingng Name { get; set; } public int Number; public SelfEntity InnerSelfEntity { get; set; } } public class SelfModel { public Guid Id { get; set; } public ssortingng Name { get; set; } public int Number; public SelfModel InnerSelfModel { get; set; } } 

Mappages:

 cfg.CreateMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(x => x.Id.ToSsortingng())) .MaxDepth(3); 

Programme:

 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); 

À partir du 3ème niveau de profondeur, nous obtiendrons la valeur null pour InnerSelfModel .

PreserveReferences n’aide pas ProjectTo, MaxDepth ne l’a pas. Si, d’une manière ou d’une autre, avec Map, vous avez un arbre de mappage qui peut déborder de la stack, mais que les instances d’objects ne sont pas dupliquées, alors PreserveReferences ne vous aidera pas, MaxDepth le fera.