AutoMapper - как игнорировать пустые поля в источнике, при использовании AutoMapper.Map - иногда - PullRequest
0 голосов
/ 14 февраля 2019

Итак, у нас есть ситуация, когда мы отображаем, скажем, ThingDto:

public class ThingDto {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Guid? SomeNiceId { get; set; }
}

и, конечно, - станцию ​​назначения Thing:

public class Thing {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Guid? SomeNiceId { get; set; }
}

Счто в нашем контексте, вот ситуация, которую я пытаюсь решить: у нас есть DTO как часть публичной библиотеки «контрактов», которую любое внешнее решение может использовать для отправки нам данных.В большинстве случаев, когда мы хотим использовать AutoMapper для сопоставления объекта ThingDto с объектом Thing, все выглядит превосходно.По умолчанию значения null на ThingDto будут «обнулять» все, что не равно нулю на объекте Thing.

Однако у нас есть ситуация, когда нам нужен null значения на исходном элементе (ThingDto) просто не отображаются на целевой объект Thing.Мы можем сделать это с Condition в настройке, но проблема в том, что мы хотим сделать это только иногда .Есть ли настройка времени выполнения, которую мы можем установить, когда звоним AutoMapper.Map<ThingDto, Thing>(thingDto, thing);?

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

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 14 февраля 2019

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

См .: Создатьдва сопоставления Automapper между одними и теми же двумя типами объектов

Может потребоваться класс-обертка, чтобы сделать его более удобным, но я бы предложил что-то вроде этого:

public class NormalProfile : Profile
{
    protected override void Configure()
    {
        base.CreateMap<ThingDto, Thing>();
    }
}

public class ProfileWithCondition : Profile
{
    protected override void Configure()
    {
        base.CreateMap<ThingDto, Thing>().ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null));
    }
}

И виспользование:

// Some code where you want to include NULL mappings would call this
var config = new MapperConfiguration(cfg => cfg.AddProfile<NormalProfile>);
config.CreateMapper.Map<ThingDto, Thing>(thing);

// Code where you don't, would do this
var config = new MapperConfiguration(cfg => cfg.AddProfile<ProfileWithCondition>);
config.CreateMapper.Map<ThingDto, Thing>(thing);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...