2010-02-02 9 views
34

Używam AutoMappera w mojej witrynie ASP.NET MVC do mapowania moich obiektów bazy danych do obiektów ViewModel i próbuję użyć kilku profili do odwzorowania tych samych typów, ale przy użyciu inna logika. Miałem pomysł robi tak czytając Matt's blog post gdzie mówi:Używanie profili w Automaperze do mapowania tego samego typu z inną logiką

Naprawdę kluczowym elementem jest profil konfiguracyjny AutoMapper. Możesz grupować konfiguracje z profilami. Być może w jednym profilu formatujesz daty w jeden sposób, w innym profilu formatujesz daty w inny sposób. Używam tylko jednego profilu tutaj.

Więc stworzyłam profil dla jednej sprawie:

public class MyProfile : Profile 
{ 
    protected override string ProfileName 
    { 
     get 
     { 
      return "MyProfile"; 
     } 
    } 

    protected override void Configure() 
    { 
     CreateMap<DateTime, String>().ConvertUsing<StringFromDateTimeTypeConverter>(); 
    } 
} 

public class StringFromDateTimeTypeConverter : ITypeConverter<DateTime, String> 
{ 
    public string Convert(DateTime source) 
    { 
     return source.ToString("dd/mm/yyyy", CultureInfo.InvariantCulture); 
    } 
} 

a drugi do innej sprawy:

public class MyProfile2 : Profile 
{ 
    protected override string ProfileName 
    { 
     get 
     { 
      return "MyProfile2"; 
     } 
    } 

    protected override void Configure() 
    { 
     CreateMap<DateTime, String>().ConvertUsing<AnotherStringFromDateTimeTypeConverter>(); 
    } 
} 

public class AnotherStringFromDateTimeTypeConverter : ITypeConverter<DateTime, String> 
{ 
    public string Convert(DateTime source) 
    { 
     return source.ToString("mm - yyyy", CultureInfo.InvariantCulture); 
    } 
} 

Jednak nie mogę znaleźć żadnego przeciążenia metody Mapper.Map<>() na podanie profil. Spojrzałem też na obiekt Configuration bez powodzenia.
Ostatni zarejestrowany profil ma zawsze pierwszeństwo.

Czy istnieje sposób użycia profili do tego celu?

Odpowiedz

39

Profile służą do segregowania typowej konfiguracji stosowanej na wielu typach map, takich jak formatowanie. Jednak mapy typów są nadal globalne. Lepiej przygotuj oddzielne obiekty konfiguracyjne i utwórz osobny MappingEngine dla każdego. Klasa Mapper jest po prostu statyczną fasadą nad każdą z nich, z pewnym zarządzaniem cyklem życia.

+0

Dzięki, zrobię to! – sebd

+0

Czy to będzie bezpieczne, ale bez blokady? Na przykład "MapperRegistry.AllMappers()" jest statyczne, a "TypeMapFactory" ma słownik statyczny. –

+0

Zazwyczaj konfiguracja jest wywoływana tylko raz dla każdej AppDomain przy uruchomieniu. Po prostu musisz znaleźć odpowiedni szew w dowolnym modelu hostingu, jaki masz, gdzie to działa (inny w przypadku WCF, ASP.NET, WinForms itp.) –

Powiązane problemy