2016-06-08 3 views
0

Я просто разбираюсь с AutoMapper и люблю, как это работает. Однако я считаю, что он может отображать некоторые сложные сценарии, которые я сейчас подключаю вручную. У кого-нибудь есть предложения/советы по удалению моих ручных процессов из упрощенного примера, приведенного ниже, и ускорения моей кривой обучения?AutoMapper - комплексное отображение с использованием вызова функции

У меня есть исходный объект следующим образом:

public class Source 
{ 
    public Dictionary<string, object> Attributes; 
    public ComplexObject ObjectWeWantAsJson; 
} 

и объект назначения так:

public class Destination 
{ 
    public string Property1; // Matches with Source.Attributes key 
    public string Property2; // Matches with Source.Attributes key 
    // etc. 
    public string Json; 
} 

Моя конфигурация для AutoMapper минимальна:

var config = new MapperConfiguration(cfg => {}); 
var mapper = config.CreateMapper(); 

И мое преобразование код выглядит так:

var destinationList = new List<Destination>(); 
foreach (var source in sourceList) 
{ 
    var dest = mapper.Map<Dictionary<string, object>, Destination(source.Attributes); 
    // I'm pretty sure I should be able to combine this with the mapping 
    // done in line above 
    dest.Json = JsonConvert.SerializeObject(source.ObjectWeWantAsJson); 

    // I also get the impression I should be able to map a whole collection 
    // rather than iterating through each item myself 
    destinationList.Add(dest); 
} 

Любые указатели или предложения наиболее ценятся. Заранее спасибо!

ответ

0

Возможно, вам будет интересно написать код конверсии с помощью TypeConverter.

internal class CustomConverter : TypeConverter<List<Source>, List<Destination>> 
{ 
    protected override List<Destination> ConvertCore(List<Source> source) 
    { 
     if (source == null) return null; 
     if (!source.Any()) return null; 
     var output = new List<Destination>(); 
     output.AddRange(source.Select(a => new Destination 
     { 
      Property1 = (string)a.Attributes["Property1"], 
      Property2 = (string)a.Attributes["Property2"], 
      Json = JsonConvert.SerializeObject(a.ObjectWeWantAsJson) 
     })); 

     return output; 
    } 
} 

var source = new List<Source> 
     { 
      new Source{ 
       Attributes = new Dictionary<string,object>{ 
        {"Property1","Property1-Value"}, 
        {"Property2","Property2-Value"} 
       }, 
       ObjectWeWantAsJson = new ComplexObject{Name = "Test", Age = 27} 
      } 
     }; 

Mapper.CreateMap<List<Source>, List<Destination>>(). 
      ConvertUsing(new CustomConverter()); 

var dest = Mapper.Map<List<Destination>>(source); 
+0

Спасибо за предложение, но это кажется почти шаг назад, чтобы вручную сопоставить каждый атрибут к свойству, когда текущее решение не требует этого (там около 20 атрибутов к карте, и есть несколько классов, как это = много написано кода Я надеялся, что AutoMapper отрицает необходимость). Мне интересно, есть ли подход «лучший из двух миров», который я могу использовать. Может быть, картограф внутри конвертера для атрибутов, но это звучит беспорядочно. Вы предложили мне подход, чтобы попробовать - экспериментируйте и посмотрите, могу ли я получить автоматическое сопоставление словарей внутри конвертера. – Gavin