Использование ValueInjecter для сопоставления объектов с разными именами свойств - PullRequest
8 голосов
/ 07 ноября 2011

Как мне сопоставить свойство объекта с другим объектом с другим именем свойства?

У меня есть класс 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);
}

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

Ответы [ 2 ]

8 голосов
/ 07 ноября 2011

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

    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);
3 голосов
/ 07 ноября 2011

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

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

Ваш код отображения контроллера будет таким простым:

Mapper.Map(product, viewModel);
...