2016-02-26 102 views
8

我有兩個實體和兩個DTO。我正在將實體映射到DTO。該DTO的簡化版本是這樣的:如何使用AfterMap來映射屬性集合屬性

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

FooBar類:

public class Foo { 

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

public class Bar { 
    // Unimportant properties 
} 

的映射

我的方法映射此爲:

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已經有配置爲Foo到FooDto和Bar到BarDto的工作正常的映射。

我需要更新FooDto中的每個BarDto使用一個服務的總數(其原因太長,無法進入 - 足以說它需要以這種方式發生)。

什麼語法我需要在AfterMap使用使用_barTotalService.CalculateTotal(bar)方法BarDto每個Total屬性映射,其中bar是有問題的Bar

請注意,_barTotalService.CalculateTotal方法需要Bar的實例而不是BarDto

+0

'Total'是BarDto'的'屬性。 'FooDto.Bars'不能擁有這個屬性。在'_barTotalService.CalculateTotal(bar)'中如何傳遞'bar'? –

+0

'FooDto'有一個叫'BarDto'類型的'Bars'集合。反過來,每個BarDto都有一個名爲'Total'的屬性。我需要使用映射的原始'Foo'對象中包含的'Bar'實例來設置此'Total'屬性。 – Graham

回答

13

這應該工作 -

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

謝謝阿米特,但我不認爲這會奏效。服務調用需要一個'Bar'而不是'BarDto'的實例。 'for'循環遍歷'BarDto'的目標集合 – Graham

+0

現在工作正常嗎? –

+0

所有好的阿米特。謝謝! – Graham