Asp.net mvc 使用ValueInjector在具有不同属性名称的对象之间映射
如何将属性从一个对象映射到另一个具有不同属性名称的对象 我有一个Asp.net mvc 使用ValueInjector在具有不同属性名称的对象之间映射,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-2,mapping,valueinjecter,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 2,Mapping,Valueinjecter,如何将属性从一个对象映射到另一个具有不同属性名称的对象 我有一个产品类,看起来像这样: public class Product : IEntity { public int Id { get; set; } public string Name { get; set; } } 视图模型如下所示: public class ProductSpecificationAddViewModel { public int ProductId { get; set; }
产品
类,看起来像这样:
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);
}
我该怎么做?您可以使用AutoMapper轻松完成这项工作。默认情况下是使用约定(即Id映射到Id和名称映射到名称),但您也可以定义自定义映射
Mapper.CreateMap<Product, ProductSpecificationAddViewModel>()
.ForMember(destination => destination.ProductName,
options => options.MapFrom(
source => source.Name));
如果您使用的是ValueInjector,那么您将编写一个ConventionInjection。参见第二个示例 此注入将从TSource.*的所有属性执行到TTarget.TSource+*,因此您可以:
vm.InjectFrom<PropToTypeProp>(product);
vm.InjectFrom(产品);
我知道使用AutoMapper很容易,但由于信任级别的原因,我无法在web主机服务器上使用它,因此我需要满足于ValueInjector。只是好奇而已。服务器上的Automapper需要什么信任级别。两者都是DLL,对吗?中等信任托管服务与automapper存在问题,因为反射.Emit在中等信任环境下不工作ConventionInjection现在世界上任何地方都找不到。
public class PropToTypeProp : ConventionInjection
{
protected override bool Match(ConventionInfo c)
{
return c.TargetProp.Name == c.Source.Type.Name + c.TargetProp.Name;
}
}
vm.InjectFrom<PropToTypeProp>(product);