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.

InformationsquelleAutor Alexander Zeitler | 2013-06-21

Schreibe einen Kommentar