Могу ли я указать источник сопоставления по умолчанию для не сопоставленных элементов с помощью AutoMapper?

#automapper #automapper-6

#automapper #automapper-6

Вопрос:

У меня есть тип, который инкапсулирует кучу связанных данных

 class CollectionNoteDetails
{
    CollectionNote Note {get;set;}
    Customer SourceCustomer {get;set;}
    Customer DestinationCustomer {get;set;}
    Haulier Haulier{ get;set;}
}
  

и я хочу его сгладить

 class CollectionNoteDto
{
    // using fields for brevity

    int Id;
    DateTime CollectionDate;
    // ... plus about 30 more props

    string SourceCustomerName;
    string DestinationCustomerName;
    string HaulierName;
}
  

в DTO есть около 30 свойств, которые выходят из CollectionNote , и несколько, которые выходят из других объектов. Другие объекты легко обрабатываются в CreateMap() вызове:

 CreateMap<CollectionNoteDetails, CollectionNoteDoc>(MemberList.Destination)
    .ForMember(d => d.SourceCustomerName, o => o.MapFrom(s => s.SourceCustomer.Name))
     .ForMember(d => d.DestinationCustomerName, o => o.MapFrom(s => s.DestinationCustomer.Name))
     .ForMember(d => d.HaulierName, o => o.MapFrom(s => s.Haulier.Name));
  

… но есть ли простой способ сопоставить остальные свойства со свойством Note источника? Что-то вроде этого составленного метода.

 CreateMap<CollectionNoteDetails, CollectionNoteDoc>(MemberList.Destination)
   .MapAllByDefault(o => o.MapFrom(s => s.Note))
   // other explicit mappings here
   .ForMember(d => d.HaulierName, o => o.MapFrom(s => s.Haulier.Name));
  

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

1. docs.automapper.org/en/latest/Flattening.html

Ответ №1:

Возможно, вам потребуется распознать префикс. Пример из документации:

 public class Source {
    public int frmValue { get; set; }
    public int frmValue2 { get; set; }
}
public class Dest {
    public int Value { get; set; }
    public int Value2 { get; set; }
}
var configuration = new MapperConfiguration(cfg => {
    cfg.RecognizePrefixes("frm");
    cfg.CreateMap<Source, Dest>();
});
  

По разным вопросам обратите внимание, что выравнивание автоматически поддерживается automapper, что означает, что этот код:

 CreateMap<CollectionNoteDetails, CollectionNoteDoc>(MemberList.Destination)
    .ForMember(d => d.SourceCustomerName, o => o.MapFrom(s => s.SourceCustomer.Name))
     .ForMember(d => d.DestinationCustomerName, o => o.MapFrom(s => s.DestinationCustomer.Name))
     .ForMember(d => d.HaulierName, o => o.MapFrom(s => s.Haulier.Name));
  

эквивалентно:

 CreateMap<CollectionNoteDetails, CollectionNoteDoc>(MemberList.Destination);