8

Как сопоставить свойство объекта с другим объектом с другим именем свойства?Использование ValueInjecter для сопоставления объектов с разными именами свойств

У меня есть Product класс, который выглядит следующим образом:

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

И вид модели выглядит следующим образом:

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

мне нужно сделать следующее отображение:

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

Вот мой метод действия:

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

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

    return View(viewModel); 
} 

Как бы это сделать?

ответ

8

Если вы используете ValueInjecter, то вы бы написать ConventionInjection. Смотрите второй образец here

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

это инъекции будут делать из всех свойств TSource * до TTarget.TSource + *, так что вы делаете:.

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

ConventionInjection не найден нигде в мире сейчас. –

3

Вы можете сделать это легко с AutoMapper. По умолчанию используется соглашение (т. Е. Идентификатор сопоставляется с идентификатором и именем по имени), но вы также можете определять пользовательские сопоставления.

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

Ваш Контроллер илит отображения кода будет, то это просто:

Mapper.Map(product, viewModel); 
+0

Я знаю, что это легко с AutoMapper, но я не могу используйте его на серверах веб-хостинга из-за уровня доверия, поэтому мне нужно установить ValueInjecter. –

+0

просто любопытно здесь. какие уровни доверия необходимы для Automapper на сервере. Оба ли dll правильно? – user20358

+1

У службы среднего доверия есть проблемы с automapper, потому что Reflection.Emit не работает в среде доверия –

Смежные вопросы