Ultimamente, in una applicazione WPF, sto utilizzando pesantemente Automapper per convertire dei DTO, ritornati da un servizio , in ViewModel.
Per chi non lo conoscesse questa libreria permette di mappare, in base a convenzioni, un oggetto in un altro .
Detto cosi sembra banale e quasi inutile, in realtà se leggete la documentazione e fate qualche test capirete che offre un sacco di funzionalità e vi tornerà utile in moltissimi casi, tra cui quello che da il titolo a questo post.
Inoltre, essendo estramemente versatile, possiamo anche creare regole custom per mappare gli oggetti o definire eccezioni in questo modo:
- Mapper.CreateMap<PersonDto, PersonViewModel>()
- .ForMember(x => x.HasError, opt => opt.Ignore());
Per facilitarmi il lavoro quotidiano, ho scritto un’extension method che indica ad Automapper di ignorare tutte le proprietà di tipo ICommand, in maniera tale da non sollevare eccezioni in fase di verifica delle mappature (operazione effettuata con il metodo Mapper.AssertConfigurationIsValid()).
Ecco quindi il codice, abbastanza intuitivo:
- public static class AutoMapperExtensions
- {
- public static IMappingExpression<TSource, TDestination> IgnoreAllICommand<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
- {
- const BindingFlags PublicInstanceFlags = BindingFlags.Public | BindingFlags.Instance;
- var destinationProperties = typeof(TDestination).GetProperties(PublicInstanceFlags);
-
- foreach (var property in destinationProperties)
- {
- if (property.PropertyType == typeof(ICommand))
- {
- expression.ForMember(property.Name, opt => opt.Ignore());
- }
- }
-
- return expression;
- }
- }
Per utilizzarlo invece:
- Mapper.CreateMap<PersonDto, PersonViewModel>()
- .IgnoreAllICommand()
- .ForMember(x => x.HasError, opt => opt.Ignore());
In questo modo non devo “dire” ad AutoMapper di ignorare i vari Command dei ViewModel singolarmente .