Сопоставить вложенный объект с пользовательским объектом в C #, используя библиотеку сопоставлений - PullRequest
0 голосов
/ 22 мая 2018

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

/// <summary>
/// nested message instance provided by a business service
/// </summary>
public class Message
{
    public string Subject { get; set; }
    public DateTime CreationDate { get; set; }
    public List<Message> Messages { get; set; }
}

, и я хочу сопоставить этот объект со следующей структурой объекта:

/// <summary>
/// UI Object used to display a nested message structure
/// </summary>
public class MessageViewModel : ViewModelBase
{
    public bool IsSelected { get; set; }

    public string Subject { get; set; }

    public DateTime CreationDate { get; set; }
    public List<MessageViewModel> Messages { get; set; }
}

Есть ли какой-либо картограф, который может получить работусделано легко?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Я настоятельно рекомендую использовать Automapper, поскольку он очень прост и удобен в использовании.В Automapper поля с одинаковыми именами отображаются по умолчанию и требуют минимальной настройки.Сопоставление, которое вы хотите получить, будет выполнено следующим образом:

  var config = new MapperConfiguration(cfg =>
  {
      cfg.CreateMap<Message, MessageViewModel>();
  });

В случае коллекций Automapper может отобразить следующее при условии, что для их типов данных определена конфигурация:

  • IEnumerable
  • ICollection
  • IList
  • Список
  • Массивы

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

Если вы хотите отобразить поля с разными именами или вам нужна некоторая проверка базового уровня в процессе, вы можете использовать следующий синтаксис для определения конфигурации:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Message, MessageViewModel>()
    .ForMember(destination => destination.SomeDestinationField, map => map.MapFrom(source => source.SomeSourceFieldWithDifferentName))
    .ForMember(destination => destination.SomeDestinationField, map => map.MapFrom(source => source.SomeSourceField ?? SomeDefaultValue));
});

Затем мы можемиспользуйте объект MapperConfiguration для инициализации Mapper и выполните наши отображения следующим образом:

SourceClass SourceObject = new SourceClass();
// Populate SourceObject with values

var mapper = config.CreateMapper();
DesitnationClass DestinationObject = mapper.Map<DesitnationClass>(SourceObject);

Я бы порекомендовал просмотреть эти документы .

0 голосов
/ 22 мая 2018

Для этого вы можете использовать AutoMapper .Чтобы сначала отобразить некоторые типы, вам нужно создать несколько отображений:

Mapper.Initialize(cfg => cfg
    .CreateMap<Message, MessageViewModel>());

. Это создает отображение от Message до MessageViewModel.По умолчанию AutoMapper отображает все свойства с одинаковыми именами.Вложенные сложные свойства также будут отображаться при наличии сопоставлений для указанных типов.Таким образом, в вашем примере приведенного выше сопоставления достаточно, поскольку вложенный тип свойства совпадает с его родительским типом, а каждому свойству исходного типа соответствует соответствующее свойство с тем же именем в целевом типе.Коллекции неявно сопоставляются с другими коллекциями.

Чтобы отобразить конкретный объект, вы можете использовать метод Mapper.Map:

var messageViewModel = Mapper.Map<MessageViewModel>(message);

Это только пример статического сопоставления, но также есть возможностьсоздать картограф как объект.Для более сложных тем вы можете прочитать документы: http://docs.automapper.org/en/stable/

...