2015-10-15 70 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

謝謝,這是一個很好的答案 –

相關問題