2017-01-26 7 views
1

У меня есть следующие классы:Установить родительские свойства при сопоставлении?

public class ParentDto 
{ 
    public Guid Guid {get; set;} 
    public IEnumerable<Child> Children {get; set;} 

    public ParentDto() { Guid = Guid.NewGuid(); } 
} 

public class ChildDto 
{ 
    public Guid Guid {get; set;} 
    public Guid ParentGuid {get; set;} 
    public IEnumerable<GrandChild> GrandChildren {get; set;} 

    public ChildDto() { Guid = Guid.NewGuid(); } 
} 

public class GrandChildDto 
{ 
    public Guid Guid {get; set;} 
    public Guid ChildGuid {get; set;} 

    public GrandChildDto() { Guid = Guid.NewGuid(); } 
} 

отображение является просто:

Mapper.Initialize(cfg => 
{ 
    cfg.CreateMap<ParentModel, ParentDto>().ReverseMap(); 
    cfg.CreateMap<ChildModel, ChildDto>().ReverseMap(); 
    cfg.CreateMap<GrandChildModel, GrandChildDto>().ReverseMap(); 
}); 

В настоящее время, я сначала сделать отображение, то я:

foreach (var child in parent.Children) 
{ 
    child.ParentGuid = parent.Guid; 

    foreach (var grandChild in child.GrandChildren) 
    { 
     grandChild.ChildGuid = child.Guid; 
    } 
} 

Это происходит потому, Guid свойства находятся только в классах DTO.

Можно ли установить контуры в конфигурации отображения и избежать блока foreach?

ответ

1

AutoMapper поддерживает код выполнения до и после операций карты.

Вы можете определить их с кодом, как этот

cfg.CreateMap<Source, Target>() 
    .AfterMap((src, dest) => { .. }); 

Но вы, вероятно, можете использовать это только тогда, когда ваши DTOS зависят от предка поколения - например, ParentDto содержит ChildDTO. Другие элементы независимы друг от друга, и использование AutoMapper может быть более сложным, чем просто использовать foreaches.

Смежные вопросы