2011-04-14 2 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 속성에 대해이 해석기를 기본적으로 사용하는 규칙이 필요합니다. 필자는 ViewTime 속성을 반영하여 DateTime을 선택하고 ForMember 및 FromMember의 과부하를 사용하여 속성 문자열 이름을 가져 왔지만 그 모양은 ... 못 생겼습니다. 또한 AutoMapper의 중첩 된 속성 이름 작성 논리를 복제하면 꽤 빨리 무너질 것입니다.

질문 : AutoMapper에 이와 같은 ValueResolver를 사용하도록하는 쉬운 방법이 있습니까? "원본의 DateTime 속성을 대상의 DateTime 속성에 매핑 할 때마다이 확인자를 사용"한다고 말하면됩니다.

AutoMapper의 테스트를 통해 살펴본 결과 제대로 작동하지 않습니다.

감사합니다.

+0

이것은 큰 질문이며 일반적인 요구 사항입니다. 나는 Jimmy의 대답에 따라 구현하려는 행운이 없었다. 누구나 따라야 할 실례를 알고 있습니까? –

답변

14

예 - MapperRegistry의 순서가 약간 변경되었습니다. 첫째, 날짜 시간에 날짜 시간에서 형식 변환기를 만들 : 그것은 TypeConverter에서 상속을 제외하고

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

귀하의 CompanyTimeConverter 코드가 꽤 많이했던 값 조르바처럼 보인다.

다음, 당신은 MapperRegistry의 순서 (I이 향후 변경거야, 더 의미가) 변경해야 : 원래

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 "mapper를 사용하여 두 유형을 서로 할당 할 수 있다면 그렇게 할 수 있습니다.

+1

굉장하고, 고마워 지미! 실제로 작동하도록 MapperRegistry의 순서를 변경할 필요가 없었습니다. AutoMapper 1.1.0.188을 실행하고 있습니다. –

+0

은 프로필 수준에서이를 수행하는 방법입니까? 나는 MapperRegistry에 대한 변경이 격리 될 수 있다고 생각하지 않는다. – chester89

+1

AutoMapper를 사용하여 엔티티와 뷰 모델을 매핑 한 다음 뷰 모델에서 엔티티로 되돌아가는 경우 (엔티티를 편집 할 때처럼)? AutoMapper를 한 방향으로 만 매핑하거나 한 방향으로 ConvertFromUtc를 사용하고 다른 방향으로 ConvertToUtc를 사용하는 방법은 무엇입니까? – Farinha