8

¿Cómo puedo asignar una propiedad de un objeto a otro objeto con un nombre de propiedad diferente?Usar ValueInjecter para correlacionar objetos con diferentes nombres de propiedad

tengo una clase Product que tiene este aspecto:

public class Product : IEntity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Y el modelo de vista parece:

public class ProductSpecificationAddViewModel 
{ 
    public int ProductId { get; set; } 
    public string ProductName { get; set; } 
} 

tengo que hacer la siguiente asignación:

Product.Id => ProductSpecificationAddViewModel.ProductId 
Product.Name =>ProductSpecificationAddViewModel.ProductName 

Aquí está mi método de acción:

public ActionResult Add(int id) 
{ 
    Product product = productService.GetById(id); 

    // Mapping 
    //ProductSpecificationAddViewModel viewModel = new ProductSpecificationAddViewModel(); 
    //viewModel.InjectFrom(product); 

    return View(viewModel); 
} 

¿Cómo haré esto?

Respuesta

8

Si está utilizando ValueInjecter entonces que iba a escribir un ConventionInjection. Ver la segunda muestra here

public class PropToTypeProp : ConventionInjection 
    { 
     protected override bool Match(ConventionInfo c) 
     { 
      return c.TargetProp.Name == c.Source.Type.Name + c.TargetProp.Name; 
     } 
    } 

esta inyección hará de todas las propiedades de TSource * a * + TTarget.TSource, por lo que hacer:.

vm.InjectFrom<PropToTypeProp>(product); 
+0

ConventionInjection no se encuentra ahora en ninguna parte del mundo. –

3

Puede hacerlo fácilmente con AutoMapper. De forma predeterminada, usa convenciones (es decir, Id asigna a Id y Nombre a nombre), pero también puede definir asignaciones personalizadas.

Mapper.CreateMap<Product, ProductSpecificationAddViewModel>() 
    .ForMember(destination => destination.ProductName, 
       options => options.MapFrom(
        source => source.Name)); 

Su código de controlador de asignación será entonces este sencillo:

Mapper.Map(product, viewModel); 
+0

Sé que es fácil con AutoMapper pero no puedo Úselo en los servidores de alojamiento web debido al nivel de confianza, así que tengo que conformarme con ValueInjecter. –

+0

simplemente curioso aquí. qué niveles de confianza se requieren para Automapper en el servidor. Ambos son dlls ¿verdad? – user20358

+1

servicio de alojamiento de confianza medio tiene problemas con Automapper porque Reflection.Emit no funciona en confianza media –

Cuestiones relacionadas