AutoMapper używa niewłaściwego konstruktora
Dzisiaj zaktualizowałem w pełni funkcjonalną aplikację za pomocą AutoMapper v1.1, aby teraz korzystać z AutoMapper v2.1 i spotykam się z problemami, których nigdy nie spotkałem w poprzedniej wersji.
Oto przykład mojego odwzorowania koduDto doDomena obiekt
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);
Jednak pierwszym problemem, z którym się spotkałem w wersji 2.1, było to, że AutoMapper próbował użyć konstruktora z 2 argumentami, gdy jeden z argumentów był pusty i powinien używać konstruktora 1 arg.
Następnie spróbowałem użyć
Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing(x => new TypeOne());
Ale otrzymałem błąd „Dwuznaczna inwokacja”, którego nie mogłem rozwiązać.
Próbowałem
Mapper.CreateMap<TypeOneDto, TypeOne>().ConvertUsing(x => new TypeOne());
i to z powodzeniem utworzyło obiekt TypeOne przy użyciu bezparametrowego konstruktora, ale później nie udało się ustawić właściwości prywatnego setera.
Szukałem pomocy na stronie AutoMapper i pobrałem kod źródłowy, aby dobrze wyglądać, ale nie udało mi się zajść daleko z małą dokumentacją i nie było wielu testów jednostkowych dla ConstructUsing.
Czy jest coś oczywistego, którego brakuje, który powinienem zmienić w wersji 2.1? Jestem zaskoczony, że tak bardzo się zmieniło od wersji 1.1.