8

Làm cách nào để ánh xạ thuộc tính từ một đối tượng sang một đối tượng khác với tên thuộc tính khác?Sử dụng ValueInjecter để ánh xạ giữa các đối tượng với các tên thuộc tính khác nhau

Tôi có một lớp Product trông như thế này:

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

Và mô hình nhìn trông giống như:

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

tôi cần phải làm các bản đồ sau:

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

Đây là phương pháp hành động của tôi:

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

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

    return View(viewModel); 
} 

Tôi làm như thế nào?

Trả lời

8

Nếu bạn đang sử dụng ValueInjecter sau đó bạn sẽ viết một ConventionInjection. Xem mẫu thứ hai here

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

tiêm này sẽ làm từ tất cả các thuộc tính của TSource * để TTarget.TSource + *, vì vậy bạn cần làm:.

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

ConventionInjection không được tìm thấy ở bất kỳ đâu trên thế giới hiện nay. –

3

Bạn có thể thực hiện việc này dễ dàng với AutoMapper. Theo mặc định, sử dụng quy ước (tức là bản đồ Id thành Id và Tên thành Tên), nhưng bạn cũng có thể xác định ánh xạ tùy chỉnh.

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

đang lập bản đồ contoller của bạn sẽ sau đó đơn giản này:

Mapper.Map(product, viewModel); 
+0

Tôi biết thật dễ dàng với AutoMapper nhưng tôi không thể sử dụng nó trên các máy chủ lưu trữ web vì mức độ tin cậy, vì vậy tôi cần phải giải quyết cho ValueInjecter. –

+0

chỉ tò mò ở đây. mức độ tin cậy được yêu cầu cho Automapper trên máy chủ. Cả hai đều là dll phải không? – user20358

+1

Dịch vụ lưu trữ tin cậy trung bình có vấn đề với automapper vì Reflection.Emit không hoạt động ở mức tin cậy trung bình –

Các vấn đề liên quan