2010-07-26 2 views
5

기본 클래스에 정의 된 클래스의 일부 속성을 무시하려는 시나리오가 있습니다.Automapper를 사용하는 하위 클래스 매핑에서 기본 클래스 속성을 무시하는 문제

내가

Mapper.CreateMap<Node, NodeDto>() 
       .Include<Place, PlaceDto>() 
       .Include<Asset, AssetDto>(); 

가 그럼 난 더 이런 식으로 사용자 정의이 같은 초기 매핑이 기본 클래스에 정의 된 속성 중 하나를 무시해야 NodeDto

Mapper.CreateMap<Node, NodeDto>() 
       .ForMember(dest => dest.ChildNodes, opt => opt.Ignore()); 

그러나 나는지도 할 때, Place to Place 또는 AssetDto에 대한 AssetDto 속성은 ChildNodes 속성이 무시되지 않습니다. 그래서, 위의 과정이 복잡 내가 NodeDto에 대한 자식 클래스를 많이 가지고 있기 때문에이

Mapper.CreateMap<Node, NodeDto>() 
       .ForMember(dest => dest.ChildNodes, opt => opt.Ignore()); 
      Mapper.CreateMap<Place, PlaceDto>() 
       .ForMember(dest => dest.ChildNodes, opt => opt.Ignore()); 
      Mapper.CreateMap<Asset, AssetDto>() 
       .ForMember(dest => dest.ChildNodes, opt => opt.Ignore()); 

같은 soething을하고 결국, 나는 더 나은 방법이 있는지 알고 싶습니다?

감사 나빌

답변

2

하지만, 아니, 그

5

작동 automapper 방법, 다른 방법이 없다 미안 그것은 얻는다 더 복잡 당신은 당신이 아니라 1을 무시 할 것인지 결정하는 경우, 2, 3 또는 기본 클래스의 속성이 더 많을 수도 있습니다. 이 경우 많은 도움이되지 않을 수 있습니다. 9 개월 만에 이미 해결책을 찾았을 것입니다. 그러나이 문제에 걸림돌이되는 다른 누군가의 이익을 위해 확장 방법을 사용하면 복잡성을 줄일 수 있습니다.

public static class MappingExtensions 
    { 
     public static IMappingExpression<Node, NodeDto> MapNodeBase<Node, NodeDto>(
      this IMappingExpression<Node, NodeDto> mappingExpression) 
     { 
      // Add your additional automapper configuration here 
      return mappingExpression.ForMember(
       dest => dest.ChildNodes, 
       opt => opt.Ignore() 
      ); 
     } 
    } 

당신은 이렇게 부를 것이다 어느 :

Mapper.CreateMap<Node, NodeDto>() 
      .MapNodeBase() 
      .Include<Place, PlaceDto>() 
      .Include<Asset, AssetDto>(); 
2

는 더 나은 방법이있다. 우리 프로젝트에서는 mappings.xml 파일을 다음과 같은 구조로 만들었습니다.

<mappings> 
    <mapping name="EntityOne"> 
    <configuration name="Flat"> 
     <ignore name="ChildCollectionOne"/> 
     <ignore name="ChildCollectionTwo"/> 
     <ignore name="ChildCollectionThree"/> 
    </configuration> 
    <configuration name="Full"> 
     <include name="ChildCollectionOne" configuration="Flat" type="One"/> 
     <include name="ChildCollectionTwo" configuration="Flat" type="Two"/> 
     <include name="ChildCollectionThree" configuration="Flat" type="Three"/> 
    </configuration> 
    </mapping> 
</mappings> 

특수 클래스 AutoMapperUtilis는 데이터 양식 xml을 구문 분석하고 주어진 규칙에 따라 Automapper를 구성하는 데 사용됩니다.

전화는 다음과 같습니다

AutoMapperUtil.Init(typeof(EntityOne),typeof(EntityOneDto), AutoMapperUtilLoadType.Flat); 

모든 필요한 매핑이 자동으로로드되며, 지정된 ChildCollections 무시 후.

이 매핑 설명을 사용하여 사용 사례에 따라 Flat 또는 Full 구성 중에서 선택할 수 있습니다. 우리는 Ria Services에서 사용되는 nHibernate 엔티티와 Dto의 매핑을 위해 AutoMapper를 사용하고 있으며,이 솔루션에 만족합니다.

+0

T4 템플릿을 정확히 사용하거나 (Visual Studio에 내장 됨) –