2011-04-14 64 views
17

我試圖讓AutoMapper負責本地化我們的視圖模型上的所有DateTime屬性。我們在系統中的任何地方都使用UTC,並在數據庫中以UTC存儲所有內容,但我們希望自動將其轉換爲用戶的時區以供顯示。全局應用AutoMapper的值解析器

看完所有選項後,我決定使用ValueResolver。這裏的解析器的要點:

public class LocalizedDateTimeFormatter : ValueResolver<DateTime, DateTime> 
{ 
    protected override DateTime ResolveCore(DateTime source) 
    { 
     // get company 

     return company.TimeZone.ConvertFromUtc(source); 
    } 
} 

我設立的映射像這樣:

Mapper.CreateMap<Entity, Model>() 
    .ForMember(dest => dest.Foo, opt => opt.ResolveUsing<LocalizedDateTimeFormatter>() 
              .FromMember(src => src.Foo)); 

這一切工作正常,我很高興。但是,理想情況下,我們希望視圖模型上的所有DateTime屬性的約定默認使用此解析器。我開始反思視圖模型屬性,選擇DateTime類型,並使用ForMember和FromMember的重載屬性字符串名稱,但看起來......很難看。加上覆制AutoMapper的嵌套屬性名稱構建邏輯會非常快速地分解。

問題:是否有任何簡單的方法告訴AutoMapper全局使用這樣的ValueResolver?要說「任何時候您將源上的DateTime屬性映射到目標上的DateTime屬性,請使用此解析器」?

我看着AutoMapper的測試,並沒有看到任何工作。

謝謝!

+0

這是一個很好的問題,我將是一個共同的要求。根據吉米的回答,我沒有嘗試實施。任何人都知道一個可以遵循的工作示例? – 2015-07-22 10:57:57

回答

14

是的 - 但MapperRegistry的順序略有變化。首先,創建日期時間從一個類型轉換器日期時間:

Mapper.CreateMap<DateTime, DateTime>().ConvertUsing<CompanyTimeConverter>(); 

你CompanyTimeConverter代碼看起來很像你有值解析器,但它自TypeConverter繼承。

接下來,你必須改變MapperRegistry的順序(我要改變這種前進,它更有意義):

MapperRegistry.AllMappers =() => new IObjectMapper[] { 
    new DataReaderMapper(), 
    new TypeMapMapper(TypeMapObjectMapperRegistry.AllMappers()), 
    new StringMapper(), 
    new FlagsEnumMapper(), 
    new EnumMapper(), 
    new ArrayMapper(), 
    new EnumerableToDictionaryMapper(), 
    new DictionaryMapper(), 
    new ListSourceMapper(), 
    new CollectionMapper(), 
    new EnumerableMapper(), 
    new TypeConverterMapper(), 
    new AssignableMapper(), 
    new NullableMapper() 
}; 

本來,「分配的」映射器之前傳來「 TypeConverter「映射器,這樣如果兩種類型可以相互賦值,它就會這樣做。

+1

真棒,謝謝吉米!我其實並不需要改變MapperRegistry的順序來讓它工作。我正在運行AutoMapper 1.1.0.188。 – 2011-04-15 18:20:13

+0

有沒有辦法在個人資料上做到這一點?我認爲MapperRegistry的更改不能孤立 – chester89 2012-10-16 06:47:05

+1

如果使用AutoMapper將實體映射到視圖模型,然後從視圖模型映射到實體(如編輯實體時會執行的操作),該怎麼辦?你如何告訴AutoMapper只能在一個方向上映射,或者在一個方向上使用ConvertFromUtc,而在另一個方向上使用ConvertToUtc? – Farinha 2014-10-24 16:23:32