Mappage personnalisé avec AutoMapper
J'ai deux objets très simples:
public class CategoryDto
{
public string Id { get; set; }
public string MyValueProperty { get; set; }
}
public class Category
{
public string Id { get; set; }
[MapTo("MyValueProperty")]
public string Key { get; set; }
}
Lors du mappage d'une Category
à un CategoryDto
avec AutoMapper, je voudrais le comportement suivant:
Les propriétés doivent être mappées comme d'habitude, sauf pour ceux qui ont la MapTo
attribut. Dans ce cas, j'ai de la lecture de la valeur de l'Attribut pour trouver la cible de la propriété. La valeur de la propriété de la source est utilisée pour trouver la valeur pour l'injecter dans la propriété de destination (avec l'aide d'un dictionnaire). Un exemple est toujours mieux que 1000 mots...
Exemple:
Dictionary<string, string> keys =
new Dictionary<string, string> { { "MyKey", "MyValue" } };
Category category = new Category();
category.Id = "3";
category.Key = "MyKey";
CategoryDto result = Map<Category, CategoryDto>(category);
result.Id //Expected : "3"
result.MyValueProperty //Expected : "MyValue"
La Key
propriété est mappée à la MyValueProperty
(via le MapTo
Attribut), et la valeur assignée est "Mavaleur", parce que la source de la valeur de propriété est "Maclé" qui est mappé (via dictionnaire) "Mavaleur".
Est-ce possible à l'aide de AutoMapper ? J'ai besoin d'une solution qui fonctionne sur tous les objets, pas seulement sur la Catégorie/CategoryDto.
source d'informationauteur Bidou
Vous devez vous connecter pour publier un commentaire.
J'ai enfin (après de nombreuses heures !!!!) trouvé une solution.
Je de les partager avec la communauté; j'espère que ça aidera quelqu'un d'autre...
Edit: Notez qu'il est maintenant beaucoup plus simple (AutoMapper 5.0+), tu peux faire comme j'ai répondu dans ce post: Comment faire AutoMapper tronquer des chaînes selon l'attribut MaxLength?
Ce devrait être assez simple à l'aide d'une mise en œuvre de IValueResolver et la ResolveUsing() la méthode. En gros, vous avez juste besoin d'avoir un constructeur de la résolution qui prend dans la propriété de l'info (ou si vous voulez être de fantaisie qui tient en une expression lambda et résout la propriété info similaire à Comment obtenir le PropertyInfo d'une propriété spécifique?. Si je n'ai pas testé moi-même, j'imagine la suivante devrait fonctionner:
Puis pour configurer le mappage que vous devez faire:
Bien sûr c'est assez brut lamda et je voudrais vous suggérer de le nettoyer en ayant votre propriété résolveur de déterminer la propriété sur l'objet source, il devrait regarder basée sur l'attribut/info propriété de sorte que vous pouvez passer un propre nouvelle PropertyBasedResolver(propriété) dans le ResolveUsing() mais j'espère que c'est ce qui explique assez pour vous mettre sur la bonne voie.
Permet de supposer que j'ai les classes suivantes
Vous pouvez passer un lambda de ResolveUsing: