Проблема в том, что неправильный конструктор используется autopper, и вы должны указать, какой конструктор использовать, используя .ConstructUsing()
в конфигурации карты.
Это текущий порядок событий, которые принимает Autopper. :
- Запуск конструктора для целевого типа (я не уверен, как autopper выбирает какой из них запускать)
public CompanyVO(int id) { // Error: passed id is the encoded string, not the decoded version and not an int
Id = id;
}
Выполнить
.BeforeMap()
Выполнить преобразователи
Ошибка может быть устранена путем указания конструктора, который будет использоваться в автоматическом преобразователе.
CreateMap<CompanyDTO, CompanyVO>()
.BeforeMap((src, dst) => Utils.DecodeState(src))
.ConstructUsing(src => new CompanyVO()) // set constructor to the parameter-less one
.ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Id.TryParseInt(-1));
Мое использование -case позволил мне использовать конструктор без каких-либо параметров, хотя я мог бы просто сделать это тоже:
CreateMap<CompanyDTO, CompanyVO>()
.ConstructUsing(src => {
Utils.DecodeState(src)
return new CompanyVO(src.Id.TryParseInt(-1))
})
.ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Id.TryParseInt(-1));