Existe uma maneira de dizer ao AutoMapper para ignorar todas as propriedades, exceto aquelas mapeadas explicitamente?
Eu tenho classes DTO externas que provavelmente mudam do lado de fora e quero evitar especificar que cada propriedade seja ignorada explicitamente, pois a adição de novas propriedades interromperá a funcionalidade (causará exceções) ao tentar mapeá-las em meus próprios objetos.
.net
automapper
Igor Brejc
fonte
fonte
.ForAllOtherMembers(opts => opts.Ignore())
AssertConfigurationIsValid()
ligação) Por causa disso, considero "Ignorar o resto" um antipadrão.Respostas:
Este é um método de extensão que escrevi que ignora todas as propriedades não existentes no destino. Não tenho certeza se ainda será útil, pois a pergunta tem mais de dois anos, mas encontrei o mesmo problema ao adicionar muitas chamadas manuais de Ignorar.
Uso:
ATUALIZAÇÃO : Aparentemente, isso não funciona corretamente se você tiver mapeamentos personalizados porque os substitui. Eu acho que ainda poderia funcionar se chamar IgnoreAllNonExisting primeiro e depois os mapeamentos personalizados posteriormente.
O schdr tem uma solução (como resposta a esta pergunta) que é usada
Mapper.GetAllTypeMaps()
para descobrir quais propriedades não estão mapeadas e ignorá-las automaticamente. Parece uma solução mais robusta para mim.fonte
Pelo que entendi, a pergunta era que existem campos no destino que não possuem um campo mapeado na origem, e é por isso que você está procurando maneiras de ignorar esses campos de destino não mapeados.
Em vez de implementar e usar esse método de extensão, você pode simplesmente usar
Agora, o automapper sabe que precisa validar apenas que todos os campos de origem estão mapeados, mas não o contrário.
Você também pode usar:
fonte
MemberList.Destination
, resolveria o problema das operações.Atualizei a extensão de Can Gencer para não substituir nenhum mapa existente.
Uso:
fonte
Mapper.GetAllTypeMaps()
é preterido)Mapper.GetAllTypeMaps()
porMapper.Configuration.GetAllTypeMaps()
. Aqui é a referência github.com/AutoMapper/AutoMapper/issues/1252Consegui fazer isso da seguinte maneira:
Nota: estou usando o AutoMapper v.2.0.
fonte
A versão 5.0.0-beta-1 do AutoMapper apresenta o
ForAllOtherMembers
método de extensão para que você possa fazer isso agora:Esteja ciente de que existe uma vantagem em mapear explicitamente cada propriedade, pois você nunca terá problemas em mapear falhas silenciosas que surgem quando você esquece de mapear uma propriedade.
Talvez, no seu caso, talvez seja sensato ignorar todos os outros membros, adicionar a
TODO
para voltar e torná-los explícitos após o término da frequência das alterações nessa classe.fonte
ForAllOtherSourceMembers
?No AutoMapper 5.0, a
.TypeMap
propriedade onIMappingExpression
foi desativada, o que significa que a solução 4.2 não funciona mais. Eu criei uma solução que usa a funcionalidade original, mas com uma sintaxe diferente:Implementação:
fonte
CreateMap<TSource,TDest>()
expressão encadeada em aProfile
?Há alguns anos desde que a pergunta foi feita, mas esse método de extensão me parece mais limpo, usando a versão atual do AutoMapper (3.2.1):
fonte
Para aqueles que estão usando a API não estática na versão 4.2.0 e acima, o seguinte método de extensão (encontrado aqui na
AutoMapperExtensions
classe) pode ser usado:O importante aqui é que, uma vez removida a API estática, o código que
Mapper.FindTypeMapFor
não funcionará mais, daí o uso doexpression.TypeMap
campo.fonte
expression.TypeMap
não está mais disponível. Aqui está a minha solução para o 5.0public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
para corrigir problemas de tipo.Para o Automapper 5.0, para pular todas as propriedades não mapeadas, basta colocar
.ForAllOtherMembers (x => x.Ignore ());
no final do seu perfil.
Por exemplo:
Nesse caso, apenas o campo Id para o objeto de saída será resolvido e todos os outros serão ignorados. Funciona como um encanto, parece que não precisamos mais de extensões complicadas!
fonte
Atualizei a resposta de Robert Schroeder para o AutoMapper 4.2. Com configurações de mapeador não estático, não podemos usar
Mapper.GetAllTypeMaps()
, mas eleexpression
tem uma referência ao necessárioTypeMap
:fonte
Como você prefere especificar que certos membros sejam ignorados? Existe uma convenção, classe base ou atributo que você gostaria de aplicar? Depois que você começa a especificar explicitamente todos os mapeamentos, não tenho certeza de qual valor você obteria do AutoMapper.
fonte
Parece uma pergunta antiga, mas pensei em postar minha resposta para qualquer pessoa que parecesse.
Eu uso ConstructUsing, inicializador de objeto juntamente com ForAllMembers ignorar, por exemplo
fonte
A única informação sobre como ignorar muitos membros é este tópico - http://groups.google.com/group/automapper-users/browse_thread/thread/9928ce9f2ffa641f . Eu acho que você pode usar o truque usado em ProvidingCommonBaseClassConfiguration para ignorar propriedades comuns para classes semelhantes.
E não há informações sobre a funcionalidade "Ignorar o resto". Eu olhei o código antes e me parece que será muito e muito difícil adicionar essa funcionalidade. Além disso, você pode tentar usar algum atributo e marcar propriedades ignoradas e adicionar algum código genérico / comum para ignorar todas as propriedades marcadas.
fonte
Eu sei que essa é uma pergunta antiga, mas @jmoerdyk na sua pergunta:
você pode usar esta resposta como essa dentro do ctor Profile
fonte
Você pode usar ForAllMembers, em vez de sobrescrever apenas o necessário
Cuidado, ele ignorará tudo e, se você não adicionar um mapeamento personalizado, eles já serão ignorados e não funcionarão.
Além disso, quero dizer, se você tiver teste de unidade para o AutoMapper. E você testa que todos os modelos com todas as propriedades mapeadas corretamente não devem usar esse método de extensão
você deve escrever ignorar explicitamente
fonte
A solução atual (versão 9) para ignorar as propriedades que não existem no tipo de destino é criar um mapeamento invertido e revertê-lo:
fonte
Na versão 3.3.1, você simplesmente pode usar
IgnoreAllPropertiesWithAnInaccessibleSetter()
ouIgnoreAllSourcePropertiesWithAnInaccessibleSetter()
métodos.fonte