2012-03-01 22 views
5

En AutoMapper 2.0 utilicé Perfiles para configurar mi asignación. Uso SourceMemberNameTransformer y DestinationMemberNameTransformer para que coincidan mis nombres de propiedad de origen y destino.Miembro perdido en AutoMapper 2.1.265

En 2.1.265 estas propiedades ya no están en el perfil. ¿Alguien sabe por qué fueron eliminados? Pero más importante aún, ¿cómo puedo duplicar esta funcionalidad?

Editar

He estado buscando en la SourceMemberNamingConvention y DestinationMemberNamingConvention, pero no puedo encontrar ninguna documentación en cuanto a cómo los trabajos. ¿Alguien tiene experiencia usando un INamingConvention personalizado?

Editar 2

miembros de origen se generan a partir de una base de datos tercera parte. Por lo general, usan todos los nombres de las columnas en minúsculas con guiones bajos entre las palabras. Algunas veces dejan de subrayar, a veces arrojan mayúsculas al azar.

Los miembros del destino intentan seguir las convenciones de nombres de .NET tanto como sea posible. Se eliminaron los signos de subrayado, el primer carácter que sigue al guión bajo se escribe en mayúscula. Se hicieron cambios de caso adicionales para hacer que los nombres de los miembros sean más fáciles de leer.

Para solucionar esto, puse

SourceMemberNameTransformer = name => name.Replace("_", "").ToUpper() 
DestinationMemberNameTransformer = name => name.ToUpper() 

Datos 3

Más información para la gente del futuro.

Inspeccioné la fuente para ver cómo se usa INamingConvention. La forma en que está diseñado es un poco engañoso. La interfaz está befined como

public interface INamingConvention 
{ 
    Regex SplittingExpression { get; } 
    string SeparatorCharacter { get; } 
} 

Sin embargo, no se AutoMapper usuario la definición completa de la interfaz para ambos SourceMemberNamingConvention y DestinationMemberNamingConvention

Se toma cada miembro del tipo de destino y se aplica DestinationMemberNamingConvention.SplittingExpression. Luego toma esas partes coincidentes y llama al string.Join usando SourceMemberNamingConvention.SeparatorCharacter. A continuación, intenta hacer coincidir los miembros del tipo de fuente con los miembros del tipo de destino.

Esta es una descripción general de alto nivel de lo que se hace y no es un intento de describir la funcionalidad completa. Simplemente está destinado a mostrar cómo se usa INamingConvention y para mostrar que SourceMemberNamingConvention.SplittingExpression y DestinationMemberNamingConvention.SeparatorCharacter nunca se utilizan.

Si no puede transformar los miembros de destino usando esta estrategia, entonces debe mapear manualmente las propiedades como nemesv's answer sugiere.

Respuesta

1

Costuras Esta característica se elimina, vea GitHub.

EDITAR reescritura después de la actualización pregunta:

Tal vez el construido en LowerUnderscoreNamingConvention resuelve su problema. He probado con este código:

Mapper.Initialize(c => 
    c.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention()); 
Mapper.CreateMap<Source, Dest>(); 
var test = Mapper.Map<Dest>(
    new Source() { test_Another_Prop = "test", test_this_prop = "test" }); 

Dónde Source y Dest:

public class Source 
{ 
    public string test_this_prop { get; set; } 
    public string test_Another_Prop { get; set; } 
    public string test_wronglynamedprop { get; set; } 
} 

public class Dest 
{ 
    public string TestThisProp { get; set; } 
    public string TestAnotherProp { get; set; } 
    public string TestWronglyNamedProp { get; set; } 
} 

Si no cubre todos los casos se puede comprobar cómo se implementa in the source y crear su propia Convetion.

EDIT: Después del comentario:

Cuando la convención no se aplica puede caer de nuevo a cambiar manualmente los casos especiales:

Mapper.CreateMap<Source, Dest>() 
    .ForMember(d => d.TestWronglyNamedProp, c => c 
    .MapFrom(s => s.test_wronglynamedprop)); 

no veo otra opción en la versión actual. Porque en lo que respecta a ver nada, reemplaza el MemberNameTransformer s.

+0

Sí, ya lo he visto. Esto no me ayuda, ya que no hago nada con prefijos o postfixes. – cadrell0

+0

¿Podría darnos un ejemplo que muestre qué está tratando de lograr? – nemesv

+0

He actualizado la pregunta – cadrell0