C# 如何使用AfterMap映射集合属性上的属性
我有两个实体和两个DTO。我正在将实体映射到DTO。DTO的简化版本如下所示:C# 如何使用AfterMap映射集合属性上的属性,c#,.net,automapper,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 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; }
}
映射
我在方法中将其映射为:
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)
});
});
}
publicfoodto映射(IMapper映射器,Foo-Foo){
//_foottalservice和_barTotalService由DI注入其他地方。
返回mapper.Map(foo,opt=>
{
可选后地图((src,dest)=>
{
目的地总计=_foottalservice.GetTotal(src);
dest.bar.Total=?????//需要使用_barTotalService.CalculateTotal(bar)
});
});
}
AutoMapper已经为Foo到FooDto和Bar到BarDto配置了映射,这些映射工作正常
我需要使用一个服务更新FooDto中的每个BarDto(原因太长,无法深入讨论,只需说需要这样做)
使用\u barTotalService.CalculateTotal(bar)
方法,我需要在AfterMap
中使用什么语法来映射BarTo
的每个Total
属性,其中bar
是有问题的bar
请注意,\u barTotalService.CalculateTotal
方法以Bar
notBarDto
为例,这应该是可行的-
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 { } }
});
AutoMapper.Mapper.CreateMap()
.AfterMap((src,dest)=>
{
dest.Total=8;//此处的服务调用
对于(变量i=0;i
您可以研究如何使用TypeConverter
,这些类可以在其构造函数中注入依赖项。因此,您在那里注入服务,并在CreateMap
之后使用类似ConstructUsing
的内容Total
是BarDto
的一个属性FooDto.bar
不能具有该属性。另外,bar
如何传入\u barTotalService.CalculateTotal(bar)
?FooDto
有一个名为bar
的集合,类型为BarDto
。依次,每个BarDto
都有一个名为Total
的属性。我需要使用原始映射的Foo
对象上包含的Bar
实例设置此Total
属性。谢谢,阿米特,但我认为这不起作用。服务调用以Bar
notBarDto
为例。for
循环正在迭代BarDto
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 { } }
});