2015-10-15 4 views
7

Wie kann ich benutzerdefinierten Wert Resolver in benutzerdefinierten Konverter Typ? Derzeit scheint es mir schwer zu erreichen. Kennst du einen Weg, wie ich diesen Kurs nutzen kann?AutoMapper - wie benutzerdefinierte Werte Resolver in benutzerdefinierten Typ Konverter zu verwenden


Person Konverter

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

Modell

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

Wert Resolver

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

Antwort

8

Wert Benutzerdefinierte Resolver zum Aufheben der Zuordnung eines bestimmten Mitglieds ausgelegt sind, wenn AutoMapper die Objekte abbilden wird:

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

Wenn Sie jedoch einen benutzerdefinierten Typ Resolver verwenden, nimmt diese vollständige Kontrolle über die Zuordnung : es gibt keine Möglichkeit der Anpassung, wie ein bestimmtes Mitglied ist abgebildet wird:

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

jedoch angegeben, dass Sie vollständige Kontrolle bei der Typumwandlung haben , gibt es nichts hindert Sie daran, den Wert Konverter Wiederverwendung, die Sie gerade ha habe es speziell verweisen: Sie jedoch eine öffentliche Methode hinzufügen müssen, die die geschützte Methode ResolveCore zurückgibt:

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

Dann Umwandlung Sie es während der Art nennen diese Eigenschaft zu beheben:

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

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

Danke, Das ist eine großartige Antwort –

Verwandte Themen