2017-04-05 13 views
1

目前我無法控制要映射到或來自哪個對象,因此更改它們目前不是選項。我正在嘗試設置一個映射,其中需要計算數組中的單個對象的大約十幾個屬性。我的映射看起來類似於現在這個權利:可以將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))... 

正如你所看到的,映射將不得不一遍又一遍的計算相同的代碼爲每個屬性,每次服用不同的最終性能。鑑於有數百個屬性(我知道,yuck),我想避免在一個大的ConstructUsing()語句中執行它。性能也是一個問題,所以我想只能確定一次正確的territoryAndCountyOption。

當您開始映射時可以在映射期間創建變量嗎?我不知道預測是否對這裏有幫助,但這不是連接到數據庫,我想在映射中指定正確的區域,而不是在每個Mapper.Map調用中。我在想這個錯誤的方式嗎?有更好的解決方案嗎?

回答

1

我不知道automapper的方式來爲你預先計算字段。我將如何解決這個問題將是創建一個TerritoryAndCountyOptionsDto對象,如果你需要的扁平性質,只需將它們添加爲唯一吸氣劑性能:

// 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物業內,而不是公衆,如果你希望隱藏它。

+0

嗯,如果我明白你在說什麼,這將涉及改變我的目標對象,對吧?我目前的方向是我不會更改源或目標對象。也許我可以用這種方法與中介對象? –

+0

我的解決方案不會更改目標對象的公共表面,但它需要一些東西。我不會使用中間對象,因爲您需要明確映射兩次,從而失去了爲您完成映射的大部分優勢。 – Richard

+0

嗯,不是公共場所,但我仍然需要自己改變課程......我*可能*能夠擺動。現在我實現了一組私有類,從服務創建映射到這些映射,然後從私有類映射到結果對象,然後我使用從服務映射到結果的構造,返回雙映射器。地圖來完成這一切,同時仍然是消費類使用時的單個Mapper.Map調用。謝謝你的幫助! –

相關問題