AutoMapper benutzerdefinierten Typ konvertieren mit ConstructServicesUsing
Entsprechend der AutoMapper Dokumentation, ich sollte in der Lage sein zu erstellen und zu verwenden, die eine Instanz einer Benutzerdefinierten Typ-Konverter mit:
var dest = Mapper.Map<Source, Destination>(new Source { Value = 15 },
opt => opt.ConstructServicesUsing(childContainer.GetInstance));
Habe ich die folgenden Quell-und Ziel-Arten:
public class Source {
public string Value1 { get; set; }
public string Value2 { get; set; }
public string Value3 { get; set; }
}
public class Destination {
public int Value1 { get; set; }
public DateTime Value2 { get; set; }
public Type Value3 { get; set; }
}
Und die folgenden Konverter:
public class DateTimeTypeConverter : ITypeConverter<string, DateTime> {
public DateTime Convert(ResolutionContext context) {
return System.Convert.ToDateTime(context.SourceValue);
}
}
public class SourceDestinationTypeConverter : ITypeConverter<Source, Destination> {
public Destination Convert(ResolutionContext context) {
var dest = new Destination();
//do some conversion
return dest;
}
}
Dieser einfache test sollte behaupten, dass der Datums-Eigenschaften korrekt Umgerechnet:
[TestFixture]
public class CustomTypeConverterTest {
[Test]
public void ShouldMap() {
Mapper.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter());
Mapper.CreateMap<Source, Destination>().ConstructUsingServiceLocator();
var destination =
Mapper.Map<Source, Destination>(
new Source { Value1 = "15", Value2 = "01/01/2000", },
options => options.ConstructServicesUsing(
type => new SourceDestinationTypeConverter())
); //exception is thrown here
Assert.AreEqual(destination.Value2.Year, 2000);
}
}
Aber ich habe schon eine Ausnahme vor, die geltend machen, geschieht:
System.InvalidCastException : Unable to cast object of type 'SourceDestinationTypeConverter ' to type 'Destination'
.
Meine Frage ist nun, wie verwende ich einen benutzerdefinierten Typ-Konverter mit ConstructServicesUsing()
?
Funktioniert diese Hilfe?: Mapper.CreateMap<Quell -, Ziel - >().ConstructUsingServiceLocator().ConvertUsing(neue SourceDestinationTypeConverter());
Oder Mapper.CreateMap<Quell -, Ziel - >().ConvertUsing(neue SourceDestinationTypeConverter()); Sowohl um die Geltendmachung Erfolg haben, aber einer von Ihnen gut für Ihre situation?
Danke, aber ich muss an die Mapper.Map-Methode (anstelle der Mapper.CreateMap), da muss ich pass in einiger Laufzeit params.
Ist es notwendig für Sie zu nutzen: - Mapper.CreateMap<Quell -, Ziel - >().ConstructUsingServiceLocator(); ? Da ich diese arbeiten mit "Mapper.CreateMap<Quell -, Ziel - >();"... Aber ich denke, Sie leitet die Laufzeit params durch den service locator ?
Ich bin immer noch mit Problemen konfrontiert, über das, was Sie versuchen zu erreichen. Ich habe lief durch ein paar code-Beispiele (alles ein wenig modifiziert, um deine), und ich zu verwalten, um eine Menge von erfolgreichen Ergebnissen. Bin ich richtig wenn ich sage, dass Sie versucht, einen IoC-Container / Objekt-Fabrik erstellen Sie Ihre Instanzen der Ziel-Objekte für die Konvertierung. (da dies ist, wo die ConstructServicesUsing kommt). Hier übergeben Sie in die Konverter-Objekt, das nicht richtig aussieht. Ich habe Probleme sowohl mit der Verwendung sowohl der IoC-Container / Fabrik UND eine benutzerdefinierte Konverter.
Oder Mapper.CreateMap<Quell -, Ziel - >().ConvertUsing(neue SourceDestinationTypeConverter()); Sowohl um die Geltendmachung Erfolg haben, aber einer von Ihnen gut für Ihre situation?
Danke, aber ich muss an die Mapper.Map-Methode (anstelle der Mapper.CreateMap), da muss ich pass in einiger Laufzeit params.
Ist es notwendig für Sie zu nutzen: - Mapper.CreateMap<Quell -, Ziel - >().ConstructUsingServiceLocator(); ? Da ich diese arbeiten mit "Mapper.CreateMap<Quell -, Ziel - >();"... Aber ich denke, Sie leitet die Laufzeit params durch den service locator ?
Ich bin immer noch mit Problemen konfrontiert, über das, was Sie versuchen zu erreichen. Ich habe lief durch ein paar code-Beispiele (alles ein wenig modifiziert, um deine), und ich zu verwalten, um eine Menge von erfolgreichen Ergebnissen. Bin ich richtig wenn ich sage, dass Sie versucht, einen IoC-Container / Objekt-Fabrik erstellen Sie Ihre Instanzen der Ziel-Objekte für die Konvertierung. (da dies ist, wo die ConstructServicesUsing kommt). Hier übergeben Sie in die Konverter-Objekt, das nicht richtig aussieht. Ich habe Probleme sowohl mit der Verwendung sowohl der IoC-Container / Fabrik UND eine benutzerdefinierte Konverter.
InformationsquelleAutor Alexander Zeitler | 2013-06-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Getestet habe ich diesen code, und hat diese Arbeit mit dem folgenden code:
Und den zusätzlichen Wandler:
Automapper fehlte ein mapping für den String-Typ und String zu Int.
Auch musste ich entfernen Sie die folgende Zeile
und ersetzen Sie es durch
Ich bin mir nicht bewusst, das "ConstructUsingServiceLocator ()" - option, aber lassen Sie es aus, funktioniert in diesem Fall... (ich habe keine Ahnung, ob man es bringt andere Probleme u. Bis jetzt habe ich noch nicht verwendet diese option, wenn die Arbeit mit Automapper.)
Bitte beachten Sie ich hatte, um die "Value3" - parameter, da die Konvertierung fehlschlagen würde... Konvertierung eines NULL-Wertes in einen Typ kann ziemlich schwer werden... (Und ich bin mir nicht bewusst, welche Art von Konvertierung wird hier passieren...)
InformationsquelleAutor Frederik Prijck