簡體   English   中英

您可以在AutoMapper中將相同的值解析器應用於多個成員

[英]In AutoMapper can you apply the same value resolver to multiple members

我有一些映射代碼如下

Mapper.CreateMap<CalculationQueryResult, CalculationViewModel>()
       .ForMember(poco => poco.NomineeFee, 
                   opt => opt.ResolveUsing<FormattedCurrencyInt>()
         .FromMember(m => m.NomineeFee))

       .ForMember(poco => poco.TotalContributions, 
                   opt => opt.ResolveUsing<FormattedCurrencyInt>()
         .FromMember(m => m.TotalContributions))

       .ForMember(poco => poco.EquityInjection, 
                   opt => opt.ResolveUsing<FormattedCurrencyInt>()
         .FromMember(m => m.EquityInjection))

  // ... SNIP Lots more members mapped with Formatted Currency Resolver

如您所見,我正在使用相同的解析程序映射多個成員,以將整數轉換為格式化的貨幣字符串。 我正在為絕大多數(但不是我的poco班上的所有成員)這樣做。

如果我不需要重復這些類型,那么所有這些成員都將使用基於約定的映射進行映射。 為一個簡單的任務編寫大量的代碼。

有什么方法可以覆蓋默認行為,即將int轉換為單個映射的字符串,然后在需要其他方法的地方執行自定義.ForMembers。 如:

Mapper.CreateMap<CalculationQueryResult, CalculationViewModel>()
            .SetDefault<int,string>(opt => opt.ResolveUsing<FormattedCurrencyInt>())
            .ForMember(poco => poco.Count, x=>x.MapFrom(s => s.Count.ToString()));

您可以創建默認映射為

Mapper.CreateMap<int, string>().ConvertUsing<FormattedCurrencyIntConverter>();

private class FormattedCurrencyIntConverter : TypeConverter<int, string> {
    protected override string ConvertCore(int numericValue) {
        return numericValue.ToString("C2");  // format here ...
    }
}

但是請注意,此映射規則將應用於所有整數! 對於某些成員可能會覆蓋此規則,但是我沒有對其進行測試。

PS:我建議明確寫下所有映射規則,並且不要依賴基於約定的映射。 如果僅在一側重命名屬性,則基於約定的映射會中斷,但是IDE可以自動重構顯式規則。

您不能以相同的方式將相同的值解析器應用於多個成員。

正如Georg Patscheider所建議的,它可以覆蓋所有映射的從int到string的默認映射,但這可能帶來比原始問題更嚴重的副作用。

您將不得不逐行寫出映射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM