2017-06-04 14 views
13
public class Foo 
{ 
    public string Baz { get; set; } 
    public List<Bar> Bars { get; set; } 
} 

Kiedy odwzorowuję powyższą klasę, czy istnieje sposób na określenie, jak głęboko chcę, aby automapper mapował obiekty? Jakiś pseudo kod tego, czego szukam:AutoMapper definiuje poziom mapowania

var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 0 }); 
// result = { Baz: "" } 

var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 1 }); 
// result = { Baz: "", Bars: [{ Blah: "" }] } 

var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 2 }); 
// result = { Baz: "", Bars: [{ Blah: "", Buzz: [{ Baz: "" }] }] } 

// etc... 

Używam obecnie automapper 3.3 z powodu zależności od nugetu.

+0

Nie ma sposobu na ustawienie poziomów w automaperze nawet w najnowszej wersji. Ponieważ zajmujesz się tylko 1 poziomem hierarchii naraz. W twoim przypadku potrzebujesz 2 konfiguracje mapperów. Jeden dla 'Foo' i drugi dla' Bar'. Możesz użyć 'opt.Ignore()' w swojej konfiguracji programu odwzorowującego dla dowolnej właściwości, której nie chcesz mapować. Automapper automatycznie mapuje, czy nazwy obiektów są takie same czy pasujące. Myślę, że w twoim przypadku nazwy obiektów są różne i potrzebujesz konfiguracji dla każdego obiektu. – Venky

Odpowiedz

7

Możesz to zrobić, podając wartość w czasie uruchamiania, na co udzielono odpowiedzi: How to ignore a property based on a runtime condition?.

Konfiguracja:

Mapper.CreateMap<Foo, FooDTO>().ForMember(e => e.Bars, 
    o => o.Condition(c => !c.Options.Items.ContainsKey("IgnoreBars"))); 

Zastosowanie:

Mapper.Map<FooDTO>(foo, opts => { opts.Items["IgnoreBars"] = true; }); 

konfiguracja samo podejście można zastosować do wszystkich zagnieżdżonych obiektów, które wymagają poziomów.

Jeśli chcesz uzyskać takie samo zachowanie dla jednostek DB, możesz użyć podejścia ExplicitExpansion zgodnie z opisem w tej odpowiedzi: Is it possible to tell automapper to ignore mapping at runtime?.

Konfiguracja:

Mapper.CreateMap<Foo, FooDTO>() 
    .ForMember(e => e.Bars, o => o.ExplicitExpansion()); 

Zastosowanie:

dbContext.Foos.Project().To<FooDTO>(membersToExpand: d => d.Bars);