mvc example ejemplo c# .net wcf automapper

ejemplo - automapper example c# mvc



Crea dos mapas de Automapper entre los mismos dos tipos de objetos (3)

Creo que puede resolver este problema con diferentes objetos de Configuración como se describe here , puede encontrar un ejemplo de esto here

Estoy usando AutoMapper en un servicio WCF para devolver objetos de User . User tiene propiedades como AccountTeams que a su vez tiene objetos secundarios. Todas las clases tienen mapas AutoMapper.

Según el OperationContract WCF que se llame, deseo devolver diferentes cantidades de datos. Quiero que un OperationContract devuelva el objeto User sin que se haya AccountTeams su propiedad AccountTeams (y sus hijos) y otro OperationContract para devolver al User toda la cadena de propiedades completada.

¿Hay alguna manera de tener dos mapas diferentes entre los mismos dos objetos o necesito realizar la asignación completa y null las propiedades que no deseo devolver del servicio?


Kevin Kalitowski planteó un buen punto sobre la respuesta de wal: si necesitamos dos configuraciones para tratar con un mapeo que tiene que ser diferente, ¿entonces no tenemos que duplicar todas las otras asignaciones que son comunes?

Creo que he encontrado una forma de evitar este uso de perfiles: tener un perfil para cada una de las asignaciones únicas y un tercer perfil para las asignaciones comunes. Luego cree dos configuraciones, una para cada perfil único, pero también agregue el perfil común a cada configuración.

Ejemplo, en AutoMapper 4.2:

Las clases a ser mapeadas: Usuario y Vehículo:

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; } }

Los perfiles:

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

Luego crea las configuraciones y asigna los objetos:

[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<CommonProfile>(); cfg.AddProfile<Profile1>(); }); var mapper1 = configuration1.CreateMapper(); var mappedUser1 = mapper1.Map<User, User>(user);//maps both Name and Age var mappedVehicle1 = mapper1.Map<Vehicle, Vehicle>(vehicle);//Maps both FleetNumber //and Registration. var configuration2 = new MapperConfiguration(cfg => { cfg.AddProfile<CommonProfile>(); cfg.AddProfile<Profile2>(); }); var mapper2 = configuration2.CreateMapper(); var mappedUser2 = mapper2.Map<User, User>(user);//maps only Name var mappedVehicle2 = mapper2.Map<Vehicle, Vehicle>(vehicle);//Same as mappedVehicle1. }

Probé esto y funciona.


Supongo que está mapeando de User a User (si no, simplemente cambie el tipo de destino)

Asuma esta clase para el siguiente ejemplo:

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

Luego puede usar AutoMapper.Configuration separado para definir 2 mapas:

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

Para evitar mapear cada dos tipos dos veces, puede agregar un método común que adopte una Configuration que mapee todo lo que se puede alcanzar desde el User y llame a esto tanto en la configuration1 como en la configuration2 después de las llamadas a CreateMap .

Actualizar

Para Automapper 4.x use lo siguiente:

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