Existe-t-il un moyen de dire à AutoMapper d'ignorer toutes les propriétés à l'exception de celles qui sont mappées explicitement?
J'ai des classes DTO externes qui sont susceptibles de changer de l'extérieur et je veux éviter de spécifier explicitement chaque propriété à ignorer, car l'ajout de nouvelles propriétés cassera la fonctionnalité (provoquera des exceptions) lors de la tentative de les mapper dans mes propres objets.
.net
automapper
Igor Brejc
la source
la source
.ForAllOtherMembers(opts => opts.Ignore())
AssertConfigurationIsValid()
appel) Pour cette raison, je considère "Ignorer le reste" comme un contre-modèle.Réponses:
Il s'agit d'une méthode d'extension que j'ai écrite qui ignore toutes les propriétés non existantes sur la destination. Je ne sais pas si cela sera toujours utile car la question a plus de deux ans, mais j'ai rencontré le même problème en ajoutant beaucoup d'appels manuels Ignore.
Usage:
MISE À JOUR : Apparemment, cela ne fonctionne pas correctement si vous avez des mappages personnalisés car ils les écrasent. Je suppose que cela pourrait encore fonctionner si appelez d'abord IgnoreAllNonExisting puis les mappages personnalisés plus tard.
schdr a une solution (comme réponse à cette question) qui utilise
Mapper.GetAllTypeMaps()
pour découvrir quelles propriétés ne sont pas mappées et les ignorer automatiquement. Cela me semble être une solution plus robuste.la source
D'après ce que j'ai compris, la question était qu'il y a des champs sur la destination qui n'ont pas de champ mappé dans la source, c'est pourquoi vous cherchez des moyens d'ignorer ces champs de destination non mappés.
Au lieu d'implémenter et d'utiliser ces méthodes d'extension, vous pouvez simplement utiliser
Maintenant, l'automappeur sait qu'il n'a qu'à valider que tous les champs source sont mappés mais pas l'inverse.
Vous pouvez aussi utiliser:
la source
MemberList.Destination
résoudrait de la même manière le problème des opérations.J'ai mis à jour l'extension Can Gencer pour ne pas écraser les cartes existantes.
Usage:
la source
Mapper.GetAllTypeMaps()
est déconseillé)Mapper.GetAllTypeMaps()
parMapper.Configuration.GetAllTypeMaps()
. Voici la référence github.com/AutoMapper/AutoMapper/issues/1252J'ai pu le faire de la manière suivante:
Remarque: j'utilise AutoMapper v.2.0.
la source
La version 5.0.0-beta-1 d'AutoMapper introduit la
ForAllOtherMembers
méthode d'extension afin que vous puissiez maintenant le faire:Sachez qu'il existe un avantage à mapper explicitement chaque propriété, car vous n'aurez jamais de problèmes de mappage échouant silencieusement qui surviennent lorsque vous oubliez de mapper une propriété.
Dans votre cas, il serait peut-être sage d'ignorer tous les autres membres et d'ajouter un
TODO
pour revenir et les rendre explicites une fois la fréquence des changements apportés à cette classe établie.la source
ForAllOtherSourceMembers
?Depuis AutoMapper 5.0, la
.TypeMap
propriété on aIMappingExpression
disparu, ce qui signifie que la solution 4.2 ne fonctionne plus. J'ai créé une solution qui utilise la fonctionnalité d'origine mais avec une syntaxe différente:La mise en oeuvre:
la source
CreateMap<TSource,TDest>()
expression enchaînée dans unProfile
?Il y a quelques années que la question a été posée, mais cette méthode d'extension me semble plus propre, en utilisant la version actuelle d'AutoMapper (3.2.1):
la source
Pour ceux qui utilisent l' API non statique dans les versions 4.2.0 et supérieures, la méthode d'extension suivante (trouvée ici dans la
AutoMapperExtensions
classe) peut être utilisée:L'important ici est qu'une fois l'API statique supprimée, le code tel que
Mapper.FindTypeMapFor
ne fonctionnera plus, d'où l'utilisation duexpression.TypeMap
champ.la source
expression.TypeMap
n'est plus disponible. Voici ma solution pour 5.0public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
pour résoudre les problèmes de type.Pour Automapper 5.0 afin d'ignorer toutes les propriétés non mappées dont vous avez juste besoin
.ForAllOtherMembers (x => x.Ignore ());
à la fin de votre profil.
Par exemple:
Dans ce cas, seul le champ Id pour l'objet de sortie sera résolu, tous les autres seront ignorés. Fonctionne comme un charme, il semble que nous n'ayons plus besoin d'extensions délicates!
la source
J'ai mis à jour la réponse de Robert Schroeder pour AutoMapper 4.2. Avec les configurations de mappeur non statiques, nous ne pouvons pas utiliser
Mapper.GetAllTypeMaps()
, mais leexpression
fait référence au requisTypeMap
:la source
Comment préférez-vous spécifier que certains membres soient ignorés? Y a-t-il une convention, une classe de base ou un attribut que vous aimeriez appliquer? Une fois que vous vous êtes lancé dans la spécification explicite de tous les mappages, je ne sais pas quelle valeur vous obtiendriez d'AutoMapper.
la source
Cela semble être une vieille question, mais j'ai pensé publier ma réponse pour toute autre personne qui ressemblerait à moi.
J'utilise ConstructUsing, l'initialiseur d'objet couplé à ForAllMembers ignore par exemple
la source
La seule infraction concernant l'ignorance de nombreux membres est ce fil - http://groups.google.com/group/automapper-users/browse_thread/thread/9928ce9f2ffa641f . Je pense que vous pouvez utiliser l'astuce utilisée dans ProvidingCommonBaseClassConfiguration pour ignorer les propriétés communes de classes similaires.
Et il n'y a aucune information sur la fonctionnalité "Ignorer le reste". J'ai déjà regardé le code et il me semble qu'il sera très et très difficile d'ajouter une telle fonctionnalité. Vous pouvez également essayer d'utiliser un attribut et marquer avec lui les propriétés ignorées et ajouter du code générique / commun pour ignorer toutes les propriétés marquées.
la source
Je sais que c'est une vieille question, mais @jmoerdyk dans votre question:
vous pouvez utiliser cette réponse comme ceci dans le profil ctor
la source
Vous pouvez utiliser ForAllMembers, que remplacer uniquement nécessaire comme ceci
Attention, il ignorera tout, et si vous n'ajoutez pas de mappage personnalisé, ils sont déjà ignorés et ne fonctionneront pas
aussi, je veux dire, si vous avez un test unitaire pour AutoMapper. Et vous testez que tous les modèles avec toutes les propriétés mappées correctement, vous ne devez pas utiliser une telle méthode d'extension
vous devez écrire explicitement ignorer
la source
La solution actuelle (version 9) pour ignorer les propriétés qui n'existent pas dans le type de destination consiste à créer un mappage inversé et à l'inverser:
la source
Dans la version 3.3.1, vous pouvez simplement utiliser les méthodes
IgnoreAllPropertiesWithAnInaccessibleSetter()
ouIgnoreAllSourcePropertiesWithAnInaccessibleSetter()
.la source