Automapper Отображение нескольких свойств в одно свойство - PullRequest
5 голосов
/ 09 февраля 2012

Мне нужна помощь в сопоставлении моего доменного объекта с ViewModel для использования с моим приложением C # / MVC

В классе FormAnswer может быть только 1 тип ответа (AnswerCurrency, AnswerDateTime, AnswerBool и т. Д.), Который применяется в логике базы данных и приложения.

Если ответ существует, его необходимо сопоставить со свойством ответа в FormAnswerModel, если все значения равны нулю, ответ является пустой строкой.

public class FormQuestion
{
   public int Id {get; set;)
   public string DataType {get; set;} 
   public string Question {get; set;} 
}

public class FormAnswer
{
   public int Id {get; set;)
   public int QuestionId {get; set;)
   public double? AnswerCurrency {get;set}
   public dateTime? AnswerDataTime {get;set}
   public bool? AnswerBool {get;set}
   public string AnswerString{get;set}
   public string AnswerText{get;set}
}

public class FormAnswerModel
{
   public int Id {get; set;)
   public int QuestionId {get; set;)
   public string Answer{get;set}
}

Ответы [ 2 ]

17 голосов
/ 09 февраля 2012

ValueResolver - хорошее предложение, особенно если у вас есть этот шаблон в другом месте.Если вы ищете быструю и грязную версию (то есть, если это единственное место, где вам нужно справиться с подобной ситуацией), попробуйте следующее:

Mapper.CreateMap<FormAnswer, FormAnswerModel>()
                .ForMember(d => d.Answer, o => o.ResolveUsing(fa =>
                    {
                        string answer = String.Empty;
                        if (fa.AnswerBool.HasValue)
                        {
                            return fa.AnswerBool.Value;
                        }

                        if(fa.AnswerCurrency.HasValue)
                        {
                            return fa.AnswerCurrency.Value;
                        }

                        if(fa.AnswerDateTime.HasValue)
                        {
                            return fa.AnswerDateTime;
                        }

                        if(!String.IsNullOrEmpty(fa.AnswerString))
                        {
                            return fa.AnswerString;
                        }

                        return answer;
                    }
                                                ));
2 голосов
/ 09 февраля 2012

Вы можете использовать собственный лямбда-метод отображения, но, похоже, здесь вам понадобится больше логики.Пользовательский распознаватель, кажется, хороший вариант в этом случае.

См. Вики Automapper

https://github.com/AutoMapper/AutoMapper/wiki/Custom-value-resolvers

В параметрах сопоставления вы можете указать opt.ResolveUsing<TResolver>() где TResolver наследуется от ValueResolver<FormAnswer, string>

Кроме того, если мне нужно узнать, как что-то сделать с Automapper, я обнаружу, что модульные тесты предоставляют очень богатую документацию.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...