如何将动态 ViewModel 列表类型映射到 DTO

How to map dynamic ViewModel List Type to DTO

问题是将嵌套对象的动态列表映射到扁平化 DTO。它包括嵌套对象的展平。还有就是接口类型。

Interface IfinalOutput
{
   object MainOutput;
   object CalcOutput;
   object SupportOutput;
}

class finalOutput<T,T2,T3> : IfinalOutput where T: IMainOutput, T2: ICalcOutput, T3: ISupportOutput
{
  public object MainOutput;
  public object CalcOutput;
  Public object SupportOutput;
  ...Other Properties
}

我们有多个具体类型的 IMainOutput、ICalcOutput、ISupportOutput 可以返回,属于不同的源系统。 例如。 ABC系统有ABCMainOutput、ABCCalcOutput、ABCSupportOutput XYZ系统有XYZMainOutput、XYZCalcOutput等

现在我们为每个源系统提供了 DTO,例如 ABCDto、XYZDto 等扁平化结构。

问题是根据对象类型将 IEnumerable 序列化并映射到 IEnumerable 或 IEnumerable,并保持列表排序。

我试过如下使用 Automapper

public List<Tto> Serialize<Tfrom, Tto>(
        IEnumerable<IFinalOutput> outputTableCompositeViewModel)
{
   List<Tto> sourceSystemDTOList = new List<Tto>();
   AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap<Tfrom, Tto>());
   foreach (var item in outputTableCompositeViewModel)
   {
     Tto outputItem = new Tto();              

     var outputTableItem = item.MainOutput;
     outputItem = AutoMapper.Mapper.Map<Tto>(outputTableItem);
     var supportTableItem = item.SupportOuput;
     var calculatedTableItem = item.CalcOutput;

     sourceSystemDTOList.Add(outputItem);
   }
   return new List<Tto>(sourceSystemDTOList);
}

现在所有属性都没有映射。请指导如何将 calc 和支持输出映射到 Dto 并避免使用 forloop。我可以使用 Automapper 或 ValueInjector。需要一种有效的方法。

我实施了以下更改并且有效。

首先,我必须为 IMainOutput 的所有具体 class 创建地图, ICalcOutput、ISupportOutput 具有如下特定源系统:

 Mapper.Initialize(cfg =>
        {

            cfg.CreateMap<ABCMainOutput, ABCdto>();
            cfg.CreateMap<ABCCalcOutput, ABCdto>();
            cfg.CreateMap<ABCSupportOutput, ABCdto>();
        });

其次,我添加了一个自动映射器扩展:

 public static TDestination Map<TSource, TDestination>(
       this TDestination destination, TSource source)
    {
        return Mapper.Map(source, destination);
    }

最后,我使用上面的扩展来序列化最终输出。

public List<Tto> Serialize<Tfrom, Tto>(
    IEnumerable<IFinalOutput> outputTableCompositeViewModel)
{
   List<Tto> sourceSystemDTOList = new List<Tto>();       
   foreach (var item in outputTableCompositeViewModel)
   {
    Tto outputItem = new Tto();              

    var outputTableItem = item.MainOutput;       
    var supportTableItem = item.SupportOuput;
    var calculatedTableItem = item.CalcOutput;
    outputItem = Mapper.Map<Tto>(outputTableItem)
                                        .Map(calculatedTableItem)
                                        .Map(supportTableItem);
    sourceSystemDTOList.Add(outputItem);
   }
  return new List<Tto>(sourceSystemDTOList);
}

并且解决方案有效。