AutoMapper - Назначить значение вручную в зависимости от значения источника

Я хотел бы вручную присвоить значение свойству DTO в профиле AutoMapper в зависимости от значения, которое у меня есть в моей сущности.

Ниже вы можете увидеть мой код, но он работает не так, как ожидалось, потому что .AfterMap не зависит от .Condition, на самом деле каждый dest.Sent сопоставляется с true:

.ForMember(
    dest => dest.Sent,
    opts => opts.Condition(src => src.Status == 2 && src.Status != 1)
)
.AfterMap((notification, dto) =>
    dto.Sent = true);

Мой DTO

public class NotificationItemDTO
{
    public long Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string Type { get; set; }
    public bool Sent { get; set; }
}

Мой источник

public class Notification
{
    public long Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string Type { get; set; }
    public int Status { get; set; }
}

Я хочу присвоить значение dest.Sent, которое является логическим, в зависимости от src.Status, которое является int. Итак, если src.Status == 1, то мой dest.Sent = false, если src.Status == 2, мой dest.Sent = true. Можно ли этого добиться?

Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
1
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы неправильно поняли использование .Condition().

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

Следовательно, в вашем сценарии вы пытаетесь присвоить целевому назначению другое значение в зависимости от условия, но не блокируете сопоставление источника с целевым назначением по условию, которое является основной целью .Condition().

Хотя .AfterMap() является последним действием, которое должно быть выполнено после выполнения логики определения сопоставления, следовательно, значение будет переопределено.


Использование .MapFrom() и определение логики для установки Sent назначения является true только тогда, когда Status источника равно 2.

CreateMap<Notification, NotificationItemDTO>()
    .ForMember(
        dest => dest.Sent,
        opts => opts.MapFrom(src => src.Status == 2)
    ); 

Демо @ .NET Fiddle

Другие вопросы по теме