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é.
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
Vous devez vous connecter pour publier un commentaire.
J'ai testé ce code et a obtenu ce travail en utilisant le code suivant:
Et les Convertisseurs supplémentaires:
Automapper manquait une cartographie de Chaîne de caractères du Type et de la Chaîne de type Int.
Aussi, j'ai dû supprimer la ligne suivante
et de la remplacer par
Je ne suis pas au courant de la "ConstructUsingServiceLocator ()", mais laissant fonctionne dans ce cas... (je n'ai aucune idée si les laissant apportera d'autres questions pour l'u. Jusqu'à maintenant, je n'ai pas encore utilisé cette option lorsque vous travaillez avec des Automapper.)
Veuillez noter que j'ai dû ajouter de la "Valeur3" paramètre depuis la conversion serait en panne... la Conversion d'une valeur NULLE à un Type peut être assez difficile... (Et je ne suis pas au courant de ce genre de conversion pour arriver ici,...)
OriginalL'auteur Frederik Prijck