AutoMapper type personnalisé convertir à l'aide de ConstructServicesUsing

Selon la AutoMapper Documentation, je devrais être capable de créer et d'utiliser une instance d'un Convertisseur de Type Personnalisé à l'aide de ceci:

var dest = Mapper.Map<Source, Destination>(new Source { Value = 15 },
    opt => opt.ConstructServicesUsing(childContainer.GetInstance));

J'ai la suite de la source et de la destination de types:

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

Et la suite des convertisseurs de type:

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

Ce test simple fait valoir que l'une des propriétés de date converties correctement:

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

Mais je l'ai déjà eu une exception avant l'assertion se produit:

System.InvalidCastException : Unable to cast object of type 'SourceDestinationTypeConverter ' to type 'Destination'.

Ma question est maintenant, comment dois-je utiliser un convertisseur de type personnalisé à l'aide de ConstructServicesUsing()?

Cela vous aide?: Mappeur.CreateMap<Source, de la Destination>().ConstructUsingServiceLocator().ConvertUsing(nouveau SourceDestinationTypeConverter());
Ou Mappeur.CreateMap<Source, de la Destination>().ConvertUsing(nouveau SourceDestinationTypeConverter()); à la Fois de rendre l'Affirmer réussir, mais est tout de bon pour votre situation?
Merci, mais j'ai besoin d'utiliser le Mappeur.La carte-Méthode (au lieu de Mapper.CreateMap) comme j'ai besoin de passer un runtime params.
Est-il nécessaire pour vous d'utiliser: Mappeur.CreateMap<Source, de la Destination>().ConstructUsingServiceLocator(); ? Depuis, je ne obtenir ce travail à "Mapper".CreateMap<Source, de la Destination>();"... Mais je suppose que vous êtes de passage ceux de l'exécution params par le service locator ?
Je suis toujours confronté à des problèmes au sujet de ce que vous essayez d'atteindre. J'ai couru à travers un couple d'échantillons de code (un peu modifié à la vôtre) et j'ai réussi à obtenir beaucoup de succès résultats. Suis-je la corriger si je dis que vous essayez d'utiliser un Conteneur IoC / Fabrique d'Objet pour créer vos instances de vos objets de destination pour la conversion. (car c'est là où le ConstructServicesUsing vient). Ici vous êtes de passage dans le Convertisseur de l'objet, qui semble incorrecte. Je vais avoir des problèmes aussi avec l'aide de deux le Conteneur IoC / usine ET un convertisseur personnalisé.

OriginalL'auteur Alexander Zeitler | 2013-06-21