A DotNet Raider

My adventures in the .NET world!
posts - 38, comments - 15, trackbacks - 0

My Links

News

Website View Martino Bordin's profile on LinkedIn XBOX 360 AVATAR - BORD1986
Locations of visitors to this page

Archives

Post Categories

Arch

BlogRoll

Codeplex

Google code

MSDN

Sites

Automapper : da Dto a ViewModel

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 .automapper

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:

  1. Mapper.CreateMap<PersonDto, PersonViewModel>()
  2.     .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:

  1. public static class AutoMapperExtensions
  2. {
  3.     public static IMappingExpression<TSource, TDestination> IgnoreAllICommand<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
  4.     {
  5.         const BindingFlags PublicInstanceFlags = BindingFlags.Public | BindingFlags.Instance;
  6.         var destinationProperties = typeof(TDestination).GetProperties(PublicInstanceFlags);
  7.  
  8.         foreach (var property in destinationProperties)
  9.         {
  10.             if (property.PropertyType == typeof(ICommand))
  11.             {
  12.                 expression.ForMember(property.Name, opt => opt.Ignore());
  13.             }
  14.         }
  15.  
  16.         return expression;
  17.     }
  18. }

Per utilizzarlo invece:

  1. Mapper.CreateMap<PersonDto, PersonViewModel>()
  2.     .IgnoreAllICommand()
  3.     .ForMember(x => x.HasError, opt => opt.Ignore());

 

In questo modo non devo “dire” ad AutoMapper di ignorare i vari Command dei ViewModel singolarmente Occhiolino.

Print | posted on sabato 3 dicembre 2011 15:59 | Filed Under [ WPF SILVERLIGHT ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET