2016-02-26 91 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