如何将动态ViewModel列表类型映射到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、ABCSupportOutputXYZ系统有XYZMainOutput、XYZCalcOutput等

现在,我们为每个源系统都提供了DTO,比如ABCDto、XYZDto之类的扁平结构。

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

我试着使用下面的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的所有具体类创建映射,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);
}

并且解决方案有效。

最新更新