2016-02-26 6 views
8

Mam dwie jednostki i dwa DTO. Mapuję podmioty do DTO. Uproszczone wersje DTOs wyglądać następująco:Jak korzystać z mapy po mapowaniu właściwości kolekcji?

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

W Foo i Bar klasy są:

public class Foo { 

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

public class Bar { 
    // Unimportant properties 
} 

Mapowanie

mam mapowanie to w sposobie, jak:

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 ma już odwzorowania skonfigurowane dla Foo do FooDto i Bar na BarDto, które działają poprawnie.

Muszę zaktualizować każdy BarDto w FooDto, korzystając z usługi (powody, dla których są zbyt długie, aby przejść do - wystarczy powiedzieć, że musi się tak stać).

Co składnia muszę używać w AfterMap mapować każdy Total własność BarDto używając metody _barTotalService.CalculateTotal(bar), gdzie bar jest Bar w pytaniu?

Należy pamiętać, że metoda _barTotalService.CalculateTotal przyjmuje instancję Bar, a nie BarDto.

+0

'Total' jest własnością' BarDto'. 'FooDto.Bars' nie może mieć właściwości. Również w jaki sposób jest przekazywane 'bar' w' _barTotalService.CalculateTotal (bar) '? –

+0

'FooDto' ma kolekcję o nazwie' Bars' typu 'BarDto'. Z kolei każde 'BarDto' ma właściwość o nazwie' Total'. Muszę ustawić tę właściwość 'Total' używając instancji' Bar' zawartych w oryginalnym obiekcie 'Foo', który jest mapowany. – Graham

Odpowiedz

13

to powinno działać -

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

Dzięki Amit, ale nie sądzę, że to zadziała. Wywołanie serwisowe przyjmuje instancję 'Bar', a nie' BarDto'. Pętla 'for' jest iterująca nad docelową kolekcją' BarDto' – Graham

+0

Czy teraz działa dobrze? –

+0

Wszystko co dobre Amit. Dziękuję Ci! – Graham

Powiązane problemy