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

时间:2018-07-22 07:30:09

标签: c# serialization automapper flatten valueinjecter

问题是将嵌套对象的动态列表映射到平坦的DTO。它包括展平嵌套对象。另外,它是接口类型。

NoSuchBeanDefinitionException: No bean named 'helloServiceEndpoint' available

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

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

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

我尝试如下使用Automapper

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
}

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

1 个答案:

答案 0 :(得分:0)

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

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

 Mapper.Initialize(cfg =>
        {

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

第二,我添加了一个automapper扩展名:

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

该解决方案有效。