8

객체의 속성을 다른 속성 이름을 가진 다른 객체에 어떻게 매핑합니까? ValueInjecter를 사용하여 다른 속성 이름을 갖는 객체 간 매핑

나는이처럼 보이는 Product 클래스가 :

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

과 같은 뷰 모델은 같습니다

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

: 나는 다음과 같은 매핑을 할 필요가

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

여기 내 행동 방법입니다 :

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

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

    return View(viewModel); 
} 

어떻게하면됩니까?

답변

8

다음은 ConventionInjection를 작성합니다

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

귀하의 콘트롤 매핑 코드는이 간단한 것입니다. . * 당신이 + *, 그래서 TTarget.TSource 두 번째 샘플 here

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

이 주입 TSource의 모든 속성에서 할 것입니다 참조 :

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

현재 전 세계 어디에서나 ConventionInjection을 찾을 수 없습니다. –

3

AutoMapper으로 쉽게 수행 할 수 있습니다. 기본적으로 규칙을 사용합니다 (즉, Id는 Name과 Name to Name으로 매핑 됨). 그러나 사용자 정의 매핑을 정의 할 수도 있습니다. 당신이 ValueInjecter를 사용하는 경우

Mapper.Map(product, viewModel); 
+0

을 나는 그것이 AutoMapper 쉽게 알고 있지만, 그럴 수 없어 신뢰 수준 때문에 웹 호스팅 서버에서 사용하므로 ValueInjecter에 대한 정착이 필요합니다. –

+0

여기에 호기심이 있습니다. 서버의 Automapper에 필요한 신뢰 수준은 무엇입니까? 둘 다 dll입니까? – user20358

+1

보통 트러스트 호스팅 서비스는 자동 허용과 관련하여 Reflection.Emit이 중간 트러스트로 작동하지 않기 때문에 문제가 발생했습니다. –

관련 문제