2016-02-26 7 views
8

私は2つのエンティティと2つの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 to FooDtoとBar to BarDtoのマッピングが正しく設定されています。

FooDtoの各BarDtoをサービスを使用して合計して更新する必要があります(その理由は、長すぎるため、このようにする必要があります)。

何構文私はbarが問題のBarある_barTotalService.CalculateTotal(bar)方法を、使用してBarDtoの各TotalプロパティをマッピングするためにAfterMapで使用する必要がありますか?

_barTotalService.CalculateTotalメソッドは、ではないBarのインスタンスを取ることに注意してください。

+0

を 'Total'は' BarDto'の財産です。 'FooDto.Bars'はそのプロパティを持つことができません。また、 'bar'は' _barTotalService.CalculateTotal(bar) 'でどのように渡されますか? –

+0

'FooDto'は' BarDto'型の 'Bars'というコレクションを持っています。次に、それぞれの「BarDto」は「合計」というプロパティを有する。マップされている元の '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

Amitさん、ありがとうございますが、これはうまくいくとは思いません。サービスコールは、「BarDto」ではなく「Bar」のインスタンスをとる。 'for'ループが' BarDto'の宛先コレクションを反復しています – Graham

+0

今は正常に動作していますか? –

+0

良いAmit。ありがとうございました! – Graham

関連する問題