2015-10-15 8 views
7

Come posso utilizzare resolver di valori personalizzati all'interno del convertitore di tipi personalizzati? Attualmente, mi sembra difficile da raggiungere. Sai come posso usare questa lezione?AutoMapper - come utilizzare il resolver valore personalizzato all'interno del convertitore di tipo personalizzato


convertitore persona

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

Modello

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

Valore resolver

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

risposta

8

resolver valore personalizzato sono progettati per sovrascrivendo la mappatura di un membro specifico, quando automapper sta per mappare gli oggetti:

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

Tuttavia, quando si utilizza un tipo personalizzato resolver, questo prende il controllo completo della mappatura : non c'è modo di personalizzare come un particolare membro è mappato:

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

Tuttavia, dato che si avere il controllo completo durante la conversione di tipo, non c'è nulla da voi arresto riutilizzare il convertitore di valori, basta ettari ve fare riferimento in modo specifico: tuttavia si dovrà aggiungere un metodo pubblico che restituisce il metodo protetto 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" 
     }; 
    } 
} 

Poi durante tipo di conversione si chiama per risolvere quella proprietà:

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

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

Grazie, questa è un'ottima risposta –

Problemi correlati