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