J'ai lutté avec celui-ci pendant un bon moment aussi, ou du moins un problème similaire à celui-ci. J'ai eu une classe avec beaucoup de propriétés (environ 30) et je voulais seulement cartographier environ 4 d'entre eux. Il semble fou d'ajouter 26 instructions ignorer (surtout quand cela signifie que les futures modifications de la classe signifiera devoir les mettre à jour!)
J'ai finalement trouvé que je pouvais dire à AutoMapper d'ignorer tout, puis d'ajouter explicitement ceux qui Je voulais.
// Create a map, store a reference to it in a local variable
var map = CreateMap<Source,Target>();
// Ignore all members
map.ForAllMembers(opt => opt.Ignore());
// Add mapping for P1
map.ForMember(dest => dest.P1, opt => opt.MapFrom(src => src.P1));
// Add other mappings...
map.ForMember(dest => dest.P2, opt => opt.MapFrom(src => src.P2));
map.ForMember(dest => dest.P3, opt => opt.MapFrom(src => src.P3));
map.ForMember(dest => dest.P4, opt => opt.MapFrom(src => src.P4));
Vous seriez pardonné de penser que vous pouvez simplement le faire (mais ne sont pas parce qu'il compilez coutume):
// This won't compile
CreateMap<Source,Target>()
.ForAllMembers(opt => opt.Ignore())
.ForMember(dest => dest.P1, opt => opt.MapFrom(src => src.P1));
La raison pour laquelle cela ne fonctionne pas est que les ForAllMembers La méthode() ne supporte pas le style fluide de chaînage (au moins dans la version actuelle 2.0).
La bonne nouvelle est que la version sans chaînage fonctionne bien. Le seul inconvénient est que vous devez indiquer explicitement à AutoMapper quels membres doivent être mappés. Je n'ai pas encore trouvé un moyen facile de l'avoir dans les deux sens, de sorte que vous pouvez toujours utiliser les mappages implicites et ignorer ceux qui sont cassés.
Cela semble être une bonne chose à faire, cependant, même si il y a 35 propriétés sur votre DTO, si vous utilisez 'AutoMapper.Mapper.AssertConfigurationIsValid();' il est possible que vous oubliez pas de carte une propriété dans le futur et cela pourrait conduire à des problèmes. Je voudrais utiliser avec ** prudence **. – CodeMonkeyKing
Depuis la version 5.0+, vous pouvez utiliser: '.ForAllOtherMembers (m => m.Ignore()) '. Voir l'exemple [ici] (http://stackoverflow.com/a/39110565/264672) –