AutoMapper использует неправильный конструктор

Сегодня я обновил полностью функционирующее приложение с помощью AutoMapper v1.1, чтобы теперь использовать AutoMapper v2.1, и я столкнулся с некоторыми проблемами, с которыми никогда не сталкивался при использовании предыдущей версии.

Вот пример моего обратного отображения кода из Dtoв Domainobject

public class TypeOne
{
   public TypeOne()
   {
   }

   public TypeOne(TypeTwo two)
   {
      //throw ex if two is null
   }

   public TypeOne(TypeTwo two, TypeThree three)
   {
      //throw ex if two or three are null
   }

   public TypeTwo Two {get; private set;}

   public TypeThree Three {get; private set;}
}

public class TypeOneDto
{
   public TypeOneDto()
   {
   }

   public TypeTwoDto Two {get; set;}

   public TypeThreeDto Three {get; set;}
}

...

Mapper.CreateMap<TypeThreeDto, TypeThree>();
Mapper.CreateMap<TypeTwoDto, TypeTwo>();
Mapper.CreateMap<TypeOneDto, TypeOne>();

var typeOne = Mapper.Map<TypeOne>(typeOneDto);

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

Затем я попытался использовать

Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing(x => new TypeOne());

, но продолжал получать сообщение об ошибке «Неоднозначный вызов», которую не мог устранить.

Затем я попытался

Mapper.CreateMap<TypeOneDto, TypeOne>().ConvertUsing(x => new TypeOne());

, и это успешно создало объект TypeOne с помощью конструктора без параметров, но затем не удалось установить свойства частного установщика.

Я обратился за помощью на веб-сайт AutoMapper и загрузил исходный код, чтобы лучше его рассмотреть, но не продвинулся далеко с небольшой документацией, а для ConstructUsing было не так много модульных тестов.

Есть ли что-то очевидное, что я упустил, что я должен изменить в версии 2.1? Я удивлен, что он так сильно изменился по сравнению с v1.1.

26
задан Mark Vickery 21 June 2012 в 21:54
поделиться