2011-12-11 1 views
2

나는 이상한 경우가있어서 나는 AutoMapper에 꽤 익숙해 어떤 일이 일어나고 있는지 이해할 수 없다.AutoMapper - "내부"지도를 수행하지 않도록 선택하는 방법은 무엇입니까?

나는 두 클래스

public class Person 
{ 
    public List<Friend> Friends {get;set;} 
} 

public class PersonView : Person 
{ 
    public new List<FriendView> Friends {get;set;} 
} 

및지도를

Mapper.CreateMap<Person, PersonView>().ForMember(d => d.Friends, 
    o => o.ResolveUsing<FriendViewResolver>().FromMember(s => s.Friends)); 

하지만, 나 또한 자신의 매핑이이 맵이 : 이제, 내부 FriendViewResolver을

Mapper.CreateMap<Friend, FriendView>().ForMember(/* a lot of stuff */); 

을 - 친구 한 명당 Mapper.Map<Friend, FriendView>()에게 전화 할께. 그러나 그것이 실행 된 후 어떤 이유로 인해 일부 속성이 손실되고 코드를 단계적으로 실행하면 AutoMapper가 목록에서 두 번째 패스를 수행하는 것으로 보입니다.

전체 컬렉션이 Friends 인 재귀적인 작업을 수행하기 때문에 FriendViewResolver을 목록에서 실행하고 싶지만 멤버에 대한 확인자 규칙이있는 경우 AM이 두 번째 패스를 수행하는 이유를 이해할 수 없습니다.

나는 그것이 정말로 의미가 있기를 바랍니다.

편집 : Mapper.Map<Person, PersonView>();을 실행할 때 문제가 발생하여 FriendViewResolver이 실행되고 올바른 결과를 얻었지만 다음 단계에서 디버거가 다시 실행되고 이미 매핑 된 개체가 망가집니다.

답변

0

난 당신이 함께하여 얻을 수 있다고 생각 : 그들은 같은 이름을 갖고 있기 때문에

Mapper.CreateMap<Person, PersonView>(); 
Mapper.CreateMap<Friend, FriendView>().ForMember(/* a lot of stuff */); 

<Person, PersonView>지도가 자동으로 친구 속성을 매핑하려고 시도합니다. <Friend, FriendView> 맵은 실제 속성 매핑을 처리해야합니다.

+0

아니요, 왜 'FriendViewResolver'가 필요한지 말씀 드렸습니다. 전체 목록에서 실행해야하는데 1 대 1 매핑을 할 수 없습니다 – Madd0g

+0

그럴 경우''매핑이 필요합니까? 선언 했어? 그것을 제거했다면 (임시적으로, 테스트를 위해)''매핑이 예상대로 작동합니까? – hawkke

+0

필자는 매핑을 생성 할 필요가있다. 나는 이것을 'FriendViewResolver'에서 수동으로 호출하고있다. 그것 없이는 'FriendViewResolver'가 결과를 유지할 수 없습니다 (입력 유형이 다르기 때문에). 그러면 다른 문제가 있습니다. – Madd0g

4

PersonView는 Person에서 파생됩니다. AutoMapper가 사용되는 방식이 아닙니다. 다른 클래스간에 매핑하는 데 사용해야합니다. 여기서하려고하는 것은 도메인 모델 Person이 있고 뷰에서 사용되는 뷰 모델 PersonView를 작성하려고한다는 것입니다. 뷰 모델이 도메인 모델에서 파생되어서는 안된다는 점을 제외하고는해야 할 일과 마찬가지로해야합니다. 그것은 독립적입니다. 그런 다음 AutoMapper를 사용하여 이들 사이를 매핑합니다. 당신을

Mapper.CreateMap<Friend, FriendView>(); 
Mapper.CreateMap<Person, PersonView>(); 

당신이 당신의 도메인 모델의 인스턴스가 (사람) :

public class PersonView 
{ 
    public List<FriendView> Friends {get;set;} 
} 

을하고 지금은 2 매핑 정의를해야합니다 :

그래서 PersonView 클래스는 다음과 같이한다 뷰 모델 (PersonView)에 맵핑 할 수 있습니다.

+0

이 메소드는 실제로 매우 잘 작동합니다. 파생 클래스가있는 모든 곳에서이 메소드를 사용했습니다.데이터를 변환하거나 추가합니다. 왜 상속 할 수있는 경우 뷰 모델에서 멤버를 다시 지정해야합니까? 내 문제는 - 나는 AM에 의해리스트 멤버가 변형되기를 원하지 않는다 - 나는 내 자신의 결정자와 함께 그것을 직접하고 싶다. – Madd0g

+3

상속받는 이유는 무엇입니까? AutoMapper와 개별 뷰 모델의 좋은 점 중 하나는 뷰 모델이 뷰를 위해 설계되었다는 것입니다. 상속은 퍼시스턴스 모델과 뷰 사이의 연결을 다시 알려줍니다. –

+0

@JimmyBogard, 상속이 내가하려는 일에 문제가 있다고 생각합니까? 리졸버가 있다면 AM이리스트 멤버에 엔티티를 매핑해서는 안된다. – Madd0g