可以将AutoMapper配置为重用计算的引用属性吗?

时间:2017-04-05 19:41:03

标签: c# automapper

目前我无法控制任何对象映射到或来自,因此更改它们目前不是一种选择。我正在尝试设置一个映射,其中从必须计算的数组中的单个对象中获取大约十几个属性。我的映射现在看起来类似于此:

.ForMember(d => d.CountyName,    o => o.MapFrom(x => x.TerritoryAndCounty.Options.OrderByDescending(y => y.Selected).FirstOrDefault()?.CountyName)))
.ForMember(d => d.County,        o => o.MapFrom(x => x.TerritoryAndCounty.Options.OrderByDescending(y => y.Selected).FirstOrDefault()?.County)))
.ForMember(d => d.TerritoryCode, o => o.MapFrom(x => x.TerritoryAndCounty.Options.OrderByDescending(y => y.Selected).FirstOrDefault()?.TerritoryCode)))
.ForMember(d => d.Address,       o => o.MapFrom(x => x.Location.Address))...

正如您所看到的,映射必须为每个属性反复计算相同的代码段,每次都使用不同的最终属性。鉴于有数百个属性(我知道,哎呀)我想避免在一个大的ConstructUsing()语句中这样做。性能也是一个问题,所以我希望能够只确定一次正确的territoryAndCountyOption。

是否有能力在开始映射时创建变量,可以在映射期间使用?我不知道预测是否会对此有所帮助,但这并不是连接到数据库,我想在映射中指定正确的区域,而不是在每个Mapper.Map调用中。我是否以错误的方式思考这个问题?有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

我不知道为您预先计算字段的自动播放方式。我如何解决这个问题的方法是创建一个TerritoryAndCountyOptionsDto对象,如果你需要扁平的属性,只需将它们添加为getter-only属性:

// Main DTO...
public TerritoryAndCountyOptions TerritoryAndCountyOptions { get; set; }
public string CountyName => TerritoryAndCountyOptions?.CountyName;

// Mapping for main object
.ForMember(d => d.TerritoryAndCountyOptions, o => o.MapFrom(x => x.TerritoryAndCounty.Options.OrderByDescending(y => y.Selected).FirstOrDefault())

如果您想隐藏TerritoryAndCountyOptions属性,可以将其设置为内部而非公开。