2012-02-15 2 views
2

사용자 정의 ValueResolver에 값을 전달하기위한 형식에 어려움을 겪고 있습니다. 기본적으로 내 ViewModel을 기반으로 Int 및 Object를 변환하려고합니다. 그러나, 나는 내 ValueResolver에에게 값을 전달받을 수 없습니다사용자 정의 ValueResolver에 값을 전달하는 방법은 무엇입니까?

나는 다음과 같은 사용자 정의 ValueResolver이 : 나는 다음과 같은 코드

같은 하드 코딩 INT를 사용하여 맵을 만들 때 잘 작동

public class CustomResolver : ValueResolver<CreateContainerViewModel, Container> 
{ 
    private int id = 0; 

    public CustomResolver(int? sourceId) 
    { 
     if(sourceId.HasValue) 
      id = sourceId.Value; 
    } 
    protected override Container ResolveCore(CreateContainerViewModel source) 
    { 
     if (id == 0) return null; 
     else 
     { 
      ISession _session = DependencyResolver.Current.GetService<ISessionFactory>().GetCurrentSession(); 
      return _session.Get<Container>(id); 
     } 
    } 
} 

Mapper.CreateMap<CreateContainerViewModel, Container>() 
.ForMember(a => a.CurrentContainer, opt => opt.ResolveUsing(src => new CustomResolver(33))); 

그러나 나는 시도하고 내 뷰 모델에서 값을 얻을 때 (매핑 예외를 throw) 작동하지 않습니다

Mapper.CreateMap<CreateContainerViewModel, Container>() 
      .ForMember(dest => dest.CurrentContainer, opt => opt.MapFrom(src => new CustomResolver(src.CurrentContainerId))); 

사용자가 ValueResolver에 값을 전달하기위한 올바른 구문의 지시를받을 수 있습니까?

감사

UPDATE :

는 기본적으로 다음과 같이 뭔가를 작성하려고 :

public class IdToObjectResolver<T> : ValueResolver<int, T> where T : class 
{ 
    private ISession _session; 
    private int id; 
    public IdToObjectResolver(Nullable<int> sourceId) 
    { 
     _session = DependencyResolver.Current.GetService<ISessionFactory>().GetCurrentSession(); 
     if(sourceId.HasValue) 
      id = sourceId.Value; 
    } 

    protected override T ResolveCore(int source) 
    { 
     return _session.Get<T>(source); 
    } 
} 

이 코드 나던 현재 이해하지만, 단지 INT에 전달하는 방법을 시도. ..

+0

이 페이지 http://automapper.codeplex.com/wikipage?title=Custom%20Value% 20Resolvers는 리졸버에게 제공되는 소스 값을 커스터마이징 할 것이라고 말합니다 - 곧 나옵니다 : – TomL

+0

[.ForMember (dest => dest.SomePropA, opt => opt.ResolveUsing)3210() .FromMember (SRC => src.propA))] [1] [1] : http://stackoverflow.com/questions/5368525/automapper-using-the-structure-returned- by-a-custom-resolver –

답변

0

내가 올바르게 이해하면 ValueResolver가 조금 복잡해 졌다고 생각합니다. 보다시피, 전체 CreateContainerViewModel 클래스는 ValueResolver의 ResolveCore 메소드로 전송됩니다. 그것은 값을 가진 전체 소스 객체가 될 것입니다.

따라서이 매핑을 사용하여 소스 개체의 id 값을 가져올 수 있어야합니다 (opt.ResolveUsing(src => new CustomResolver())). (생성자 arg없이).

희망이 도움이됩니다.

편집 :

내 시험 :

 [TestMethod] 
     public void TestMethod1() 
     { 
      Mapper.CreateMap<CreateContainerViewModel, Container>() 
       .ForMember(a => a.CurrentContainer, opt => opt.ResolveUsing<CustomResolver>()); 


      var source = new CreateContainerViewModel() 
      { 
       ID = 3 
      }; 

      var destination = new Container(); 

      Mapper.Map(source, destination); 

      Assert.AreEqual(destination.CurrentContainer.ID, 3); 

     } 

CustomResolver :

public class CustomResolver : ValueResolver<CreateContainerViewModel, Container> 
{ 
    protected override Container ResolveCore(CreateContainerViewModel source) 
    { 

      return new Container() { ID = source.ID }; 
    } 
} 
+0

감사합니다 @dtryon. 내 도메인의 객체에 외래 키 ID 필드를 확인하기위한보다 일반적인 솔루션을 개발하려고합니다. 게시 된 솔루션이 작동하는 동안 모든 외래 키 개체에 대한 새 사용자 지정 해결 프로그램을 만들어야합니다. 매핑되는 개체의 속성에서 ID를 전달할 수있는 일반적인 솔루션을 개발할 수 있기를 희망했습니다. – TomL

+0

내 원래의 질문을 달성하려는 시도의 예로 업데이트했습니다. – TomL

+0

좋아, 나는 오해해야한다고 생각합니다.그러나, 새로운 예제에서도, 어떤 객체가 'sourceId'인가요? 원본 개체 또는 대상 개체 또는 둘 다? –

관련 문제