2015-10-15 6 views
7

カスタムタイプコンバータ内でカスタム値リゾルバを使用するにはどうすればよいですか? 現在、私は達成するのが難しいようです。私はこのクラスをどのように使うことができるか知っていますか?AutoMapper - カスタムタイプコンバータ内でカスタム値リゾルバを使用する方法


人コンバータ

class PersonConverter : ITypeConverter<PersonData, Person> 
{ 
    public Person Convert(ResolutionContext context) 
    { 
     var personData = context.SourceValue as PersonData; 
     if (personData == null) 
     { 
      return null; 
     } 

     var person = new Person 
     { 
      Name = personData.Name 
     }; 
     //person.Dic = // use here my DictionaryResolver 

     return person; 
    } 
} 

モデル

class Person 
{ 
    public string Name { get; set; } 
    public Dictionary Dic { get; set; } 
} 

class PersonData 
{ 
    public string Name { get; set; } 
    public int DicId { get; set; } 
} 

class Dictionary 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

値リゾルバ

class DictionaryResolver : ValueResolver<int, Dictionary> 
{ 
    protected override Dictionary ResolveCore(int source) 
    { 
     // do something 
     return new Dictionary 
     { 
      Id = source, 
      Name = "Name" 
     }; 
    } 
} 

答えて

8

AutoMapperは、オブジェクトをマップしようとしたとき、カスタム値リゾルバは、特定のメンバーのマッピングをオーバーライドするために設計されています:カスタム型のレゾルバを使用する場合

Mapper.CreateMap<PersonData, Person>() 
       .ForMember(dest => dest.Dic, opt => opt.ResolveUsing<DictionaryResolver>()); 

はしかし、これは、マッピングの完全な制御を取得:ある特定のメンバーがマッピングされている方法をカスタマイズする方法はありません。

Mapper.CreateMap<TPersonData, Person>().ConvertUsing(PersonConverter); // No ForMember here. 

をしかし、与えられたあなたは型変換中完全に制御を持っていること、値変換、あなただけヘクタールを再利用し、あなたを止めるからは何もありません特にそれを参照しまし:あなたが保護されたメソッドResolveCoreを返すパブリックメソッドを追加する必要がありますが:型変換中に次に

class DictionaryResolver : ValueResolver<int, Dictionary> 
{ 
    public Dictionary Resolve(int source) 
    { 
     return ResolveCore(source); 
    } 

    protected override Dictionary ResolveCore(int source) 
    { 
     // do something 
     return new Dictionary 
     { 
      Id = source, 
      Name = "Name" 
     }; 
    } 
} 

を、あなたはそのプロパティを解決するためにそれを呼び出す:

var person = new Person 
    { 
     Name = personData.Name 
    }; 

DictionaryResolver resolver = new DictionaryResolver(); 
person.Dic = resolver.Resolve(personData.IntValue); // whatever value you use 
+0

ありがとう、それは素晴らしい答えです –