¿Hay alguna manera de decirle a AutoMapper que ignore todas las propiedades, excepto las que se asignan explícitamente?
Tengo clases externas de DTO que es probable que cambien desde el exterior y quiero evitar especificar que cada propiedad se ignore explícitamente, ya que agregar nuevas propiedades romperá la funcionalidad (causará excepciones) cuando intente asignarlas a mis propios objetos.
.net
automapper
Igor Brejc
fuente
fuente
.ForAllOtherMembers(opts => opts.Ignore())
AssertConfigurationIsValid()
llamada) Debido a esto, considero que "Ignorar el resto" es un antipatrón.Respuestas:
Este es un método de extensión que escribí que ignora todas las propiedades no existentes en el destino. No estoy seguro de si seguirá siendo útil ya que la pregunta tiene más de dos años, pero me encontré con el mismo problema al tener que agregar muchas llamadas de Ignorar manuales.
Uso:
ACTUALIZACIÓN : Aparentemente, esto no funciona correctamente si tiene asignaciones personalizadas porque las sobrescribe. Supongo que aún podría funcionar si llama a IgnoreAllNonExisting primero y luego las asignaciones personalizadas más tarde.
schdr tiene una solución (como respuesta a esta pregunta) que utiliza
Mapper.GetAllTypeMaps()
para averiguar qué propiedades no están asignadas y las ignora automáticamente. Parece una solución más robusta para mí.fuente
Por lo que entendí, la pregunta era que hay campos en el destino que no tienen un campo mapeado en la fuente, por lo que está buscando formas de ignorar esos campos de destino no mapeados.
En lugar de implementar y usar estos métodos de extensión, simplemente podría usar
Ahora el automapper sabe que solo necesita validar que todos los campos de origen estén asignados, pero no al revés.
También puedes usar:
fuente
MemberList.Destination
resolvería el problema de operaciones.He actualizado la extensión de Can Gencer para no sobrescribir ningún mapa existente.
Uso:
fuente
Mapper.GetAllTypeMaps()
está en desuso)Mapper.GetAllTypeMaps()
conMapper.Configuration.GetAllTypeMaps()
. Aquí está la referencia github.com/AutoMapper/AutoMapper/issues/1252He podido hacer esto de la siguiente manera:
Nota: Estoy usando AutoMapper v.2.0.
fuente
La versión 5.0.0-beta-1 de AutoMapper presenta el
ForAllOtherMembers
método de extensión para que ahora pueda hacer esto:Tenga en cuenta que existe una ventaja al mapear explícitamente cada propiedad, ya que nunca tendrá problemas de mapeo silencioso que surgen cuando se olvida de mapear una propiedad.
Quizás en su caso, sería aconsejable ignorar a todos los demás miembros y agregar un
TODO
para volver y hacerlos explícitos después de que se establezca la frecuencia de los cambios en esta clase.fuente
ForAllOtherSourceMembers
?A partir de AutoMapper 5.0, la
.TypeMap
propiedadIMappingExpression
ha desaparecido, lo que significa que la solución 4.2 ya no funciona. Creé una solución que usa la funcionalidad original pero con una sintaxis diferente:Implementación:
fuente
CreateMap<TSource,TDest>()
expresión encadenada en aProfile
?Han pasado algunos años desde que se hizo la pregunta, pero este método de extensión me parece más limpio, usando la versión actual de AutoMapper (3.2.1):
fuente
Para aquellos que usan la API no estática en la versión 4.2.0 y superior, se puede usar el siguiente método de extensión (que se encuentra aquí en la
AutoMapperExtensions
clase):Lo importante aquí es que una vez que se elimina la API estática, el código como
Mapper.FindTypeMapFor
ya no funcionará, de ahí el uso delexpression.TypeMap
campo.fuente
expression.TypeMap
ya no está disponible. Aquí está mi solución para 5.0public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
para solucionar problemas de tipo.Para Automapper 5.0 para omitir todas las propiedades no asignadas, solo necesita poner
.ForAllOtherMembers (x => x.Ignore ());
al final de tu perfil.
Por ejemplo:
En este caso, solo el campo Id para el objeto de salida se resolverá, todos los demás se omitirán. Funciona de maravilla, ¡parece que ya no necesitamos extensiones difíciles!
fuente
He actualizado la respuesta de Robert Schroeder para AutoMapper 4.2. Con configuraciones de mapeador no estático, no podemos usar
Mapper.GetAllTypeMaps()
, peroexpression
tiene una referencia a lo requeridoTypeMap
:fuente
¿Cómo preferiría especificar que ciertos miembros sean ignorados? ¿Hay alguna convención, clase base o atributo que le gustaría aplicar? Una vez que entre en el negocio de especificar todas las asignaciones explícitamente, no estoy seguro de qué valor obtendría de AutoMapper.
fuente
Esta parece una vieja pregunta, pero pensé que publicaría mi respuesta para cualquier otra persona que parezca que era.
Utilizo ConstructUsing, el inicializador de objeto junto con ForAllMembers ignora, por ejemplo
fuente
La única información sobre ignorar a muchos miembros es este hilo: http://groups.google.com/group/automapper-users/browse_thread/thread/9928ce9f2ffa641f . Creo que puede usar el truco utilizado en Pro ProvideCommonBaseClassConfiguration para ignorar las propiedades comunes de clases similares.
Y no hay información sobre la funcionalidad "Ignorar el resto". He visto el código antes y me parece que será muy y muy difícil agregar dicha funcionalidad. También puede intentar usar algún atributo y marcar con él las propiedades ignoradas y agregar algún código genérico / común para ignorar todas las propiedades marcadas.
fuente
Sé que esta es una vieja pregunta, pero @jmoerdyk en tu pregunta:
puedes usar esta respuesta como esta dentro del Perfil ctor
fuente
Puede usar ForAllMembers, que sobrescribir solo se necesita de esta manera
Tenga cuidado, lo ignorará todo, y si no agrega mapeo personalizado, ya se ignorarán y no funcionarán.
También, quiero decir, si tiene prueba de unidad para AutoMapper. Y prueba que todos los modelos con todas las propiedades asignadas correctamente no deberían usar dicho método de extensión
deberías escribir ignorar explícitamente
fuente
La solución actual (versión 9) para ignorar las propiedades que no existen en el tipo de destino es crear una asignación invertida y revertirla:
fuente
En la versión 3.3.1 simplemente puede usar
IgnoreAllPropertiesWithAnInaccessibleSetter()
oIgnoreAllSourcePropertiesWithAnInaccessibleSetter()
métodos.fuente