2010-02-02 16 views
34

Estoy usando AutoMapper en mi sitio web ASP.NET MVC para asignar mis objetos de base de datos a objetos ViewModel y estoy tratando de usar varios perfiles para mapear los mismos tipos, pero usando otra lógica Tuve la idea de hacerlo al leer Matt's blog post donde dice:Usar perfiles en Automapper para mapear los mismos tipos con lógica diferente

La parte realmente clave es el perfil de configuración de AutoMapper. Puede agrupar configuraciones con perfiles. Quizás en un perfil, usted da formato a las fechas de una manera, en otro perfil puede formatear las fechas de otra manera. Solo estoy usando un perfil aquí.

Así que he creado un perfil para un caso:

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); 
    } 
} 

y otra para otro caso:

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); 
    } 
} 

Sin embargo, no se encuentra ninguna sobrecarga del método Mapper.Map<>() para especificar una perfil. También eché un vistazo al objeto Configuration sin suerte.
El último perfil registrado siempre tiene prioridad.

¿Hay alguna manera de usar perfiles para este propósito?

Respuesta

39

Los perfiles son para segregar la configuración común aplicada en varios mapas de tipos, como el formateo. Sin embargo, los mapas tipo siguen siendo globales. Es mejor que cree objetos de configuración separados y cree un MappingEngine separado para cada uno. La clase Mapper es simplemente una fachada estática sobre cada uno de ellos, con alguna gestión del ciclo de vida.

+0

¡Gracias, lo haré! – sebd

+0

¿Será eso seguro para hilos sin el bloqueo? Por ejemplo, 'MapperRegistry.AllMappers()' es estático y 'TypeMapFactory' tiene un diccionario estático. –

+0

Normalmente, la configuración solo se llama una vez por AppDomain al inicio. Solo necesita encontrar la costura correcta en el modelo de hosting que tenga para el lugar donde va (diferente para WCF, ASP.NET, WinForms, etc.) –

Cuestiones relacionadas