AutoMapper verwendet den falschen Konstruktor

Heute habe ich eine voll funktionsfähige Anwendung mit AutoMapper v1.1 auf AutoMapper v2.1 aktualisiert und stoße auf einige Probleme, auf die ich mit der vorherigen Version nie gestoßen bin.

Hier ist ein Beispiel für meine Codezuordnung ausDto zuDomain Objekt

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);

Das erste Problem, auf das ich mit v2.1 gestoßen bin, war, dass AutoMapper versuchte, den Konstruktor mit 2 Argumenten zu verwenden, wenn eines der Argumente null war und den Konstruktor mit 1 Argument verwenden sollte.

Ich habe dann versucht zu verwenden

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

Es wurde jedoch immer wieder der Fehler "Ambiguous Invocation" angezeigt, den ich nicht beheben konnte.

Ich habe es dann versucht

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

Das TypeOne-Objekt wurde zwar erfolgreich mit dem parameterlosen Konstruktor erstellt, die Eigenschaften für den privaten Setter konnten jedoch nicht festgelegt werden.

Ich habe auf der AutoMapper-Website nach Hilfe gesucht und den Quellcode heruntergeladen, um mich umzusehen, bin aber mit der kleinen Dokumentation nicht weit gekommen, und es gab nicht viele Komponententests für ConstructUsing.

Fehlt mir etwas, das ich mit v2.1 ändern sollte? Ich bin überrascht, dass sich seit Version 1.1 so viel geändert hat.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage