如何将动态 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);
}
并且解决方案有效。
问题是将嵌套对象的动态列表映射到扁平化 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);
}
并且解决方案有效。