Crea due mappe di Automapper tra gli stessi due tipi di object

Sto usando AutoMapper in un servizio WCF per restituire oggetti User . User ha proprietà come AccountTeams che a sua volta hanno oggetti figlio. Tutte le classi hanno mappe AutoMapper.

A seconda del OperationContract WCF chiamato, desidero restituire diverse quantità di dati. Voglio un OperationContract per restituire l’object User senza la proprietà AccountTeams (e i relativi figli) popolati e un altro OperationContract per restituire User l’intera catena di proprietà compilate.

C’è un modo per avere due mappe diverse tra gli stessi due oggetti o devo eseguire il mapping completo e null le proprietà che non voglio restituire dal servizio?

Kevin Kalitowski ha sollevato un buon punto sulla risposta di wal: Se abbiamo bisogno di due configurazioni per gestire una mapping che deve essere diversa, allora non dobbiamo duplicare tutti gli altri mapping che sono comuni?

Penso di aver trovato un modo per aggirare questo usando i profili: avere un profilo per ciascuno dei mapping univoci e un terzo profilo per i mapping comuni. Quindi creare due configurazioni, una per ciascun profilo univoco, ma anche aggiungere il profilo comune a ciascuna configurazione.

Esempio, in AutoMapper 4.2:

Le classi da mappare: Utente e Veicolo:

 public class User { public string Name { get; set; } public int Age { get; set; } } public class Vehicle { public int FleetNumber { get; set; } public string Registration { get; set; } } 

I profili:

 public class Profile1 : Profile { protected override void Configure() { base.CreateMap(); } } public class Profile2 : Profile { protected override void Configure() { base.CreateMap().ForMember(dest => dest.Age, opt => opt.Ignore()); } } public class CommonProfile : Profile { protected override void Configure() { base.CreateMap(); } } 

Quindi creare le configurazioni e mappare gli oggetti:

 [TestMethod] public void TestMethod() { var user = new User() { Name = "John", Age = 42 }; var vehicle = new Vehicle {FleetNumber = 36, Registration = "XYZ123"}; var configuration1 = new MapperConfiguration(cfg => { cfg.AddProfile(); cfg.AddProfile(); }); var mapper1 = configuration1.CreateMapper(); var mappedUser1 = mapper1.Map(user);//maps both Name and Age var mappedVehicle1 = mapper1.Map(vehicle);//Maps both FleetNumber //and Registration. var configuration2 = new MapperConfiguration(cfg => { cfg.AddProfile(); cfg.AddProfile(); }); var mapper2 = configuration2.CreateMapper(); var mappedUser2 = mapper2.Map(user);//maps only Name var mappedVehicle2 = mapper2.Map(vehicle);//Same as mappedVehicle1. } 

Ho provato questo e funziona.

Suppongo che tu stia mappando da User a User (se non è sufficiente cambiare il tipo di destinazione)

Assumi questa class per il seguente esempio:

 public class User { public string Name { get; set; } public int Age { get; set; } } 

È quindi ansible utilizzare AutoMapper.Configuration separato per definire 2 mappe:

 [TestMethod] public void TestMethod() { var configuration1 = new Configuration(new TypeMapFactory(), MapperRegistry.AllMappers()); var mapper1 = new MappingEngine(configuration1); configuration1.CreateMap(); var user = new User() { Name = "John", Age = 42 }; var mappedUser1 = mapper1.Map(user);//maps both Name and Age var configuration2 = new Configuration(new TypeMapFactory(), MapperRegistry.AllMappers()); configuration2.CreateMap().ForMember(dest => dest.Age, opt => opt.Ignore()); var mapper2 = new MappingEngine(configuration2); var mappedUser2 = mapper2.Map(user); Assert.AreEqual(0, mappedUser2.Age);//maps only Name } 

Per evitare di mappare a vicenda ogni due tipi, è ansible aggiungere un metodo comune che accetta una Configuration che mappa tutto ciò che può essere raggiunto User e lo chiama sia su configuration1 che su configuration2 dopo le chiamate a CreateMap .

Aggiornare

Per Automapper 4.x utilizzare quanto segue:

 var configuration1 = new MapperConfiguration(cfg => { cfg.CreateMap(); }); var mapper1 = configuration1.CreateMapper(); var user = new User() { Name = "John", Age = 42 }; var mappedUser1 = mapper1.Map(user);//maps both Name and Age var configuration2 = new MapperConfiguration(cfg => { cfg.CreateMap().ForMember(dest => dest.Age, opt => opt.Ignore()); }); var mapper2 = configuration2.CreateMapper(); var mappedUser2 = mapper2.Map(user); //maps only Name 

Penso che tu possa risolvere questo problema con diversi oggetti di configurazione come descritto qui , puoi trovare un esempio di questo qui