2016-02-26 10 views
8

Ich habe zwei Entitäten und zwei DTOs. Ich ordne die Entitäten den DTOs zu. Vereinfachte Versionen der DTOs wie folgt aussehen:So verwenden Sie AfterMap, um Eigenschaften für die Auflistungseigenschaft zuzuordnen

public class FooDto { 
    // Other properties removed for clarity. 
    public string Description { get; set; } 
    public decimal Total { get; set; } 
    public ICollection<BarDto> Bars { get; set; } 
} 

public class BarDto { 
    // Other properties removed for clarity. 
    public decimal Total { get; set; } 
} 

Die Foo und Bar Klassen sind:

public class Foo { 

    public ICollection<Bar> Bars { get; set; } 
} 

public class Bar { 
    // Unimportant properties 
} 

Das Mapping

ich dies Abbildung in einem Verfahren, wie:

public FooDto Map(IMapper mapper, Foo foo) { 

     // _fooTotalService and _barTotalService injected elsewhere by DI. 

     return mapper.Map<Foo, FooDto>(foo, opt => 
     { 
      opt.AfterMap((src, dest) => 
      { 
       dest.Total = _fooTotalService.GetTotal(src); 
       dest.Bars.Total = ?????? // Needs to use _barTotalService.CalculateTotal(bar) 
      }); 
     }); 
} 

AutoMapper hat bereits Zuordnungen konfiguriert für Foo zu FooDto und Bar zu BarDto, die gut funktionieren.

Ich muss jedes BarDto in FooDto mit einem Gesamtwert über einen Dienst aktualisieren (die Gründe dafür sind zu lang, um zu gehen - es genügt zu sagen, dass es so geschehen muss).

Welche Syntax kann ich in AfterMap verwenden muß jede Total Eigenschaft BarDto mit der _barTotalService.CalculateTotal(bar) Methode zur Karte, wo bar die Bar in Frage?

Beachten Sie, dass die _barTotalService.CalculateTotal-Methode eine Instanz Bar nicht BarDto übernimmt.

+0

'Total' ist eine Eigenschaft von' BarDto'. 'FooDto.Bars' kann die Eigenschaft nicht haben. Wie wird 'bar' in' _barTotalService.CalculateTotal (bar) 'übergeben? –

+0

'FooDto' hat eine Sammlung namens' Bars' vom Typ 'BarDto'. Jede "BarDto" hat wiederum eine Eigenschaft namens "Total". Ich muss diese "Total" -Eigenschaft mithilfe der Instanzen von "Bar" festlegen, die auf dem ursprünglichen "Foo" -Objekt enthalten sind, das zugeordnet wird. – Graham

Antwort

13

sollte diese Arbeit -

AutoMapper.Mapper.CreateMap<Foo, FooDto>() 
      .AfterMap((src, dest) => 
      { 
       dest.Total = 8;//service call here 
       for (var i = 0; i < dest.Bars.Count; i++) 
       { 
        dest.Bars.ElementAt(i).Total = 9;//service call with src.Bars.ElementAt(i) 
       } 
      }); 
AutoMapper.Mapper.CreateMap<Bar, BarDto>(); 
var t = AutoMapper.Mapper.Map<FooDto>(new Foo 
     { 
      Bars = new List<Bar> { new Bar { } } 
     }); 
+0

Danke Amit, aber ich denke nicht, dass das funktionieren wird. Der Serviceaufruf benötigt eine Instanz von "Bar" und nicht "BarDto". Die 'for'-Schleife iteriert über die Ziel-Collection von 'BarDto' – Graham

+0

Funktioniert es jetzt? –

+0

Alles gute Amit. Vielen Dank! – Graham

Verwandte Themen