Automapper — Сопоставляет вложенный объект с частным ctor и частными установщиками только в том случае, если все поля не являются нулевыми

#c# #automapper

Вопрос:

Сценарий

Этот сценарий является упрощенной моделью, обратите внимание

  • частные конструкторы без параметров
  • частный сеттер по свойствам
 class Nested  {  public int Month { get; private set; }   public int Year { get; private set; }   private Nested() { }   public Nested(int month, int year)  {  // There are some validations but the simplicity of this example I omitted its  Month = month;   Year = year;  } }   class Root {  public int Id { get; private set; }   public string Title { get; private set; }   public Nested Nested { get; private set; }   private Root() { }   public Root(int id, string title, Nested nested)  {  // There are some validations but the simplicity of this example I omitted its  Id = id;  Title = title;  Nested = nested;  } }  

Теперь у меня есть класс выравнивания БД

 class RootDb {  public int Id { get; set; }   public string Title { get; set; }   public int? Nested_Month { get; set; }   public int? Nested_Year { get; set; } }   

Чего достичь

Я хочу сопоставить корневую базу данных с корневой, но опустить (установить значение null) Вложенное свойство ValueObject, если ВСЕ поля имеют значения null и НЕ ИСПОЛЬЗУЮТ общедоступный вложенный конструктор.

Что я пытаюсь

Этот код не работает, вложенное свойство имеет значение Nested { Year = null, Month = null }

 CreateMap<Root, RootDb>()  .ForMember(p => p.Nested_Month, o => o.MapFrom(f => f.Mested.Month))  .ForMember(p => p.Nested_Year, o => o.MapFrom(f => f.Nested.Year))  .ReverseMap()  .ForMember(p=> p.Nested, o => o.Condition(src => src.Nested_Month != null amp;amp; src.Nested_Year != null))  ;    

Рабочее решение

Я нашел это решение, но является ли оно единственным? Я думаю, что это слишком сложно

 CreateMap<Root, RootDb>()  .ForMember(p => p.Nested_Month, o => o.MapFrom(f => f.Mested.Month))  .ForMember(p => p.Nested_Year, o => o.MapFrom(f => f.Nested.Year))  ;  CreateMap<RootDb, Nested>()  .ForMember(p => p.Month, o => o.MapFrom(f => f.Nested_Month))  .ForMember(p => p.Year, o => o.MapFrom(f => f.Nested_Year))  .ForAllOtherMembers(p=> p.Ignore())  ;  CreateMap<RootDb, Root>()  .ForMember(p => p.Nested, o =>  {  o.Condition(src =>  src.Nested_Month != null amp;amp;  src.Nested_Year != null);  o.MapFrom(f => f);  })  ;   

Есть какие-нибудь предложения ?

Комментарии:

1. Просто общее соображение: я люблю использовать AutoMapper для простого сопоставления. Если это становится непросто, я добавляю процедурный код для отображения оставшихся полей после картографа. Вызов карты. Код должен быть понятен будущим разработчикам