如何使用AfterMap映射集合属性的属性

时间:2016-02-26 09:04:47

标签: c# .net automapper

我有两个实体和两个DTO。我正在将实体映射到DTO。 DTO的简化版本如下:

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中使用Total方法使用BarDto方法映射每个_barTotalService.CalculateTotal(bar)属性的语法,其中barBar 1}}有问题吗?

请注意,_barTotalService.CalculateTotal方法的实例为Bar而不是BarDto

2 个答案:

答案 0 :(得分:15)

这应该有效 -

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

答案 1 :(得分:0)

您可以使用orElseGet()进行研究,这些类可以在其构造函数中进行依赖注入。因此,您将服务注入到那里,并在TypeConverter之后使用ConstructUsing之类的东西。