2012-02-15 13 views
2

私はカスタムValueResolverに値を渡すためのフォーマットに苦労しています。私は基本的に私のViewModelに基づいてIntとObjectを変換しようとしています。しかし、私はそれが私のValueResolverにそれに値を渡すことができませんカスタムValueResolverに値を渡す方法は?

I以下のカスタム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))); 

が、私は試してみて、私のviewmodelから値を取得するときには、(マッピングの例外をスロー)動作していない

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); 
    } 
} 

このコードのdoesntは、現在、意味をなさないが、ちょうどint型を渡すの方法を取得しようとしています。 ..

+0

このページhttp://automapper.codeplex.com/wikipage?title=Custom%20Value% 20Resolversは、リゾルバに供給されたソース値をカスタマイズすることをお勧めします - 近日中に:) – TomL

+0

[.ForMember(dest => dest.SomePropA、opt => opt.ResolveUsing ().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()))。 (コンストラクタ引数なし)。

これが役に立ちます。

EDIT:

私のテスト:

 [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'ですか?ソースオブジェクトまたはデスティネーションオブジェクトかどちらか? –

関連する問題