2016-02-26 5 views
8

Ho due entità e due DTO. Sto mappando le entità ai DTO. versioni semplificate dei DTOs assomigliano:Come utilizzare AfterMap per mappare le proprietà sulla proprietà della raccolta

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

I Foo e Bar classi sono:

public class Foo { 

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

public class Bar { 
    // Unimportant properties 
} 

la mappatura

sto mappando questo in un metodo come:

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 ha già mappature configurate per Foo a FooDto e Bar a BarDto che funzionano bene.

Ho bisogno di aggiornare ogni BarDto in FooDto con un totale utilizzando un servizio (i motivi per cui sono troppo lunghi per entrare - è sufficiente dire che deve avvenire in questo modo).

Cosa sintassi ho bisogno per utilizzare in AfterMap per mappare ogni Total proprietà del BarDto utilizzando il metodo _barTotalService.CalculateTotal(bar), dove bar è la Bar in questione?

Si noti che il metodo _barTotalService.CalculateTotal prende un'istanza di Bar non BarDto.

+0

'total' è una struttura di' BarDto'. 'FooDto.Bars' non può avere la proprietà. Inoltre, come viene passato 'bar' in' _barTotalService.CalculateTotal (bar) '? –

+0

'FooDto' ha una collezione chiamata' Bars' di tipo 'BarDto'. A loro volta, ogni 'BarDto' ha una proprietà chiamata' Total'. Ho bisogno di impostare questa proprietà 'Total' usando le istanze di' Bar' contenute nell'oggetto 'Foo' originale che viene mappato. – Graham

risposta

13

Questo dovrebbe funzionare -

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

Grazie Amit, ma non penso che funzionerà. La chiamata di servizio prende un'istanza di 'Bar' not' BarDto'. Il ciclo 'for' sta iterando sulla collezione di destinazione di' BarDto' – Graham

+0

Sta funzionando bene ora? –

+0

Tutto bene, Amit. Grazie! – Graham