Как настроить Automapper так, чтобы он игнорировал свойства объекта, если свойства равны нулю, но отображать, если не нуль - PullRequest
0 голосов
/ 05 августа 2020

Я использую Automapper. При этом я сопоставил объекты DTO с другим объектом.

Класс UserProperties.

public string DisplayName { get; set; }

public int Id { get; set; }

public int NotesCount {get;set;}

Класс PersonsDTO

public string UserName { get; set; }

public int UserId { get; set; }

public int NotesCount { get ; set; }

public int BooksCount { get; set; }

Класс людей

public UserProperties? UserDetails { get; set; }

public int NotesCount { get ; set; }

public int BooksCount { get; set; }

В профиле сопоставления

CreateMap<PersonsDTO, Persons>()
             .ForPath(o => o.UserDetails.DisplayName, b => b.MapFrom(z => z.UserName))
             .ForPath(o => o.UserDetails.Id, b => b.MapFrom(z => z.UserId))
             .ReverseMap();

В моем случае UserDetails в классе Persons является типом, допускающим значение NULL. Если UserId в классе PeronsDTO равно 0, значит, мне не нужно сопоставлять UserDetails. Он должен возвращать значение null для свойства UserDetails.

Как этого добиться?

Версия Automapper: 9.0.0

1 Ответ

1 голос
/ 07 августа 2020

Вы можете указать настраиваемый преобразователь для явного выполнения настраиваемого сопоставления.

    CreateMap<PersonDTO, Person>()
      .ForMember(dest => dest.UserDetails, opt => opt.MapFrom<CustomResolver>());

    public class CustomResolver : IValueResolver<PersonDTO, Person, UserProperties>
    {
        public UserProperties Resolve(PersonDTO source, Person destination, UserProperties member, ResolutionContext context)
        {
            if (source.UserId == 0)
                return null;
            return new UserProperties
            {
                DisplayName = source.UserName,
                Id = source.UserId
            };
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...