AutoMapper语言 - 将对象列表映射到更大的对象列表



考虑以下类:

public class Colli
{
public int Count { get; set; }
public string Description { get; set; }
}
public class Shipment
{
public List<Colli> Collis { get; set; }
}
public class ShipmentDto
{
public List<ColliDto> Collis { get; set; }
}
public class ColliDto
{
public string Description { get; set; }
}

我希望Collis的列表基于ColliCount生成具有相同描述的ColliDtos的新列表。

JSON中期望的输入/输出示例:

{
"collis": [
{
"count": 2,
"description": "Colli 1"
},
{
"count": 1,
"description": "Colli 2"
}
]
}
{
"collis": [
{
"description": "Colli 1"
},
{
"description": "Colli 1"
},
{
"description": "Colli 2"
}
]
}

(真正的类有更多的字段—这只是一个最小的工作示例)

我的研究表明,使用ITypeConverter应该可以解决这个问题,我尝试创建以下内容:

public class ColliConverter : ITypeConverter<Colli, List<ColliDto>>
{
public List<ColliDto> Convert(Colli source, List<ColliDto> destination, ResolutionContext context)
{
var retval = new List<ColliDto>();
for (int i = 0; i < source.Count; i++)
{
retval.Add(context.Mapper.Map<ColliDto>(source));
}
return retval;
}
}

使用以下映射配置文件:

CreateMap<Colli, List<ColliDto>>().ConvertUsing<ColliConverter>();

但是,在转换器类中设置断点告诉我它没有被使用。

这可以用AutoMapper完成吗?还是我应该走"老路线",手工映射这个类?

解决方案1

  1. 创建ShipmentConverter类型转换器,用于从Shipment对象映射到ShipmentDto对象。
public class ShipmentConverter : ITypeConverter<Shipment, ShipmentDto>
{
public ShipmentDto Convert(Shipment source, ShipmentDto destination, ResolutionContext context)
{
destination = new ShipmentDto();
destination.Collis = new List<ColliDto>();

foreach (var colli in source.Collis)
{
for (int i = 0; i < colli.Count; i++)
{
destination.Collis.Add(context.Mapper.Map<ColliDto>(colli));
}
}

return destination;
}
}
  1. Shipment的映射配置文件
CreateMap<Colli, ColliDto>();
CreateMap<Shipment, ShipmentDto>()
.ConvertUsing<ShipmentConverter>();

演示方案1 @ .NET Fiddle


解决方案2

  1. 创建ColliListConverter类型转换器,用于从Colli列表映射到ColliDto列表。
public class ColliListConverter : ITypeConverter<List<Colli>, List<ColliDto>>
{
public List<ColliDto> Convert(List<Colli> source, List<ColliDto> destination, ResolutionContext context)
{
var retval = new List<ColliDto>();
foreach (var colli in source)
{
for (int i = 0; i < colli.Count; i++)
{
retval.Add(context.Mapper.Map<ColliDto>(colli));
}
}

return retval;
}
}
  1. Shipment的映射配置文件
cfg.CreateMap<Colli, ColliDto>();
cfg.CreateMap<List<Colli>, List<ColliDto>>()
.ConvertUsing<ColliListConverter>();
cfg.CreateMap<Shipment, ShipmentDto>();

演示方案2 @ .NET Fiddle

相关内容

  • 没有找到相关文章

最新更新