Как запретить AutoMapper инициализировать целевой элемент JObject при нулевом источнике - PullRequest
0 голосов
/ 30 ноября 2018

Предположим, у вас есть следующие классы:

public class Source
{
    public string Data { get; set; }
}

public class Destination
{
    public JObject Data { get; set; }
}

И вы конфигурируете AutoMapper, используя это:

Mapper.Initialize(
    cfg =>
    {
        cfg.CreateMap<Source, Destination>()
            .ForMember(
                d => d.Data, 
                c => c.MapFrom(s => JsonConvert.DeserializeObject(s.Data ?? "")
    }
);

Когда вы отображаете объект Source со значением для Dataэто приводит к нулевому json (например, нулевое значение, пустая строка или строка «null», все из которых приводят к тому, что JsonConvert возвращает null), значение Destination.Data в конечном итоге устанавливается равным пустому JObject вместо null.

Есть ли способ вообще запретить Automapper инициализировать целевой элемент?

Есть несколько разных вещей, которые вы можете сделать, но большинство из них покрывают только часть случаев.Например, вы можете добавить условие в сопоставление, чтобы оно применялось только тогда, когда Source.Data не равно нулю или не пусто.Но это не работает, если Source.Data является строкой "null".

Есть ли лучший способ справиться с этим без необходимости добавлять кучу особых условий обсадной колонны снаружи?

Side Примечание: Я могу заставить его работать, предоставив отображение верхнего уровня между строкой и JObject.Но это означало бы, что я должен использовать одну и ту же логику для каждого случая, и я ТОЛЬКО хочу, чтобы она применялась к этому одному свойству.

1 Ответ

0 голосов
/ 30 ноября 2018

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

cfg.CreateMap<Source, Destination>()
   .ForMember(destination => destination.Data, 
              options => options.AddTransform(data=>data.Count == 0 ? null : data));

Дело в том, что то, что вы разрешаете, снова отображается, и если AllowNullCollections имеет значение false, AM должен будет создать его дляВы :) Смотрите также это .

...