Automapper est un "mappeur d'objet-objet" pour .Net, ce qui signifie copier des objets d'une classe dans une autre classe qui représente la même chose.
Pourquoi cela est-il utile? La duplication des classes est-elle toujours utile / bonne conception?
Réponses:
Une recherche rapide sur Google a révélé cet exemple:
http://www.codeproject.com/Articles/61629/AutoMapper
montrant une utilisation parfaitement valide d'AutoMapper qui n'est certainement pas un exemple de conception médiocre. Dans une application en couches, vous pouvez avoir des objets dans vos données ou votre couche métier et vous n'avez parfois parfois besoin que d'un sous-ensemble d'attributs de ces objets de données ou d'une sorte de vue dans la couche d'interface utilisateur. Vous créez donc un modèle de vue contenant des objets avec exactement les attributs dont vous avez besoin dans votre interface utilisateur, et utilisez AutoMapper pour fournir le contenu de ces objets avec moins de code passe-partout.
Dans une telle situation, vos "objets de vue" ne sont pas une copie de la classe d'origine. Ils ont des méthodes différentes et peut-être quelques attributs en double. Mais cela n’est pas grave tant que vous utilisez ces objets de vue uniquement à des fins d’affichage d’interface utilisateur et ne commencez pas à les utiliser à mauvais escient pour la manipulation de données ou les opérations commerciales.
Un autre sujet que vous pourrez lire pour mieux comprendre ceci est le modèle de séparation des responsabilités de la requête Fowlers de la commande , par opposition à CRUD. Il vous montre des situations dans lesquelles différents modèles d'objet pour interroger des données et les mettre à jour dans une base de données ont du sens. Ici, le mappage d'un modèle d'objet à un autre peut également être effectué par un outil tel qu'AutoMapper.
la source
Il est recommandé de disposer d'une classe de modèle de vue distincte pour une utilisation dans la couche d'interface utilisateur plutôt que d'utiliser la même classe que celle utilisée dans la couche de données. Votre interface utilisateur / page Web peut avoir besoin d'afficher d'autres informations qui ne sont pas strictement liées à l'entité de données. En créant cette classe supplémentaire, vous vous donnez la liberté de modifier facilement votre interface utilisateur à mesure que les exigences changent avec le temps.
En ce qui concerne l'utilisation d'AutoMapper, je l'évite personnellement pour 3 raisons:
Les échecs silencieux plus fréquents
Étant donné qu'AutoMapper mappe automatiquement entre les propriétés, la modification du nom d'une propriété sur une classe et non sur l'autre entraînera l'omission du mappage de la propriété. Le compilateur ne le saura pas. Automapper ne s'en soucie pas.
Absence d'analyse statique
Donc, vous avez une grande base de code à traiter. Il y a un million de classes avec un million de propriétés. On dirait qu'ils ne sont pas utilisés ou sont des doublons. Cet outil "Rechercher toutes les références" dans Visual Studio vous aidera à voir où les propriétés sont utilisées et à créer une carte dans votre tête indiquant comment toute l'application se bloque. Mais attendez, il n'y a aucune référence explicite à la moitié des propriétés, car Automapper est utilisé. Mon travail est maintenant beaucoup plus dur.
Besoins tardifs qui augmentent la complexité
Automapper est tout à fait dandy lorsque tout ce que vous voulez faire est de copier les valeurs d'une classe à une autre (comme c'est souvent le cas au début du développement), mais vous souvenez-vous de ces exigences qui changent avec le temps? Que faire si vous avez maintenant besoin d'obtenir des valeurs d'autres parties de votre application, par exemple spécifiques à l'utilisateur connecté ou à un autre état contextuel?
La façon dont AutoMapper crée les mappages de classe un-à-un au démarrage de l'application ne se prête pas bien à ce type de changements spécifiques au contexte. Oui, il y a probablement moyen de le faire fonctionner, mais je trouve généralement plus propre, plus simple et plus expressif d'écrire la logique moi-même.
En résumé, avant d’atteindre Automapper pour économiser 30 secondes de mappage manuel d’une classe à une autre, réfléchissez-y.
Dans cet esprit, demandez-vous "AutoMapper est-il utile aujourd'hui et sera-t-il demain?"
la source
D'après mon expérience, quand quelqu'un s'est plaint de «trop de casse-tête» et veut utiliser AutoMapper, c'est l'un des cas suivants:
Toutefois:
Si vous avez choisi une langue de type statique, profitez-en. Si vous essayez de contourner les contrôles de la langue qui permettent d'éviter les erreurs dues à l'utilisation excessive d'API réfléchissantes et magiques telles qu'AutoMapper, cela signifie simplement que vous avez choisi une langue qui ne répond pas à vos besoins.
De plus, le fait que Microsoft ait ajouté des fonctionnalités au C # ne signifie pas qu’elles sont honnêtes dans toutes les situations ou qu’elles prennent en charge les meilleures pratiques. Reflection et le mot clé 'dynamic', par exemple, doivent être utilisés dans les cas où vous ne pouvez tout simplement pas accomplir ce dont vous avez besoin sans eux. AutoMapper n'est pas une solution pour tous les cas d'utilisation qui ne peuvent pas déjà être résolus sans cela.
Alors, la duplication des classes est-elle une mauvaise conception? Pas nécessairement.
AutoMapper est-il une mauvaise idée? Oui absolument.
L'utilisation d'AutoMapper indique des déficiences systémiques dans le projet. Si vous en avez besoin, arrêtez-vous et réfléchissez à votre conception. Vous trouverez toujours une conception meilleure, plus lisible, plus maintenable et plus sans bugs.
la source
Il y a un problème plus profond ici: le fait que C # et Java insister plus / tous les types doivent être distingués par leur nom plutôt que de la structure: par exemple ,
class MyPoint2D
etclass YourPoint2D
sont des types distincts , même si elles ont exactement les mêmes définitions. Quand le type que vous voulez est "quelque chose d'anonyme avec unx
champ et uny
champ" (c'est-à-dire un enregistrement ), vous n'avez pas de chance. Donc, lorsque vous voulez transformer unYourPoint2D
en unMyPoint2D
, vous avez trois options:this.x = that.x; this.y = that.y
Le choix 1 est assez facile à petites doses mais devient vite une corvée lorsque le nombre de types à cartographier est important.
Le choix 2 n’est pas souhaitable, car vous devez maintenant ajouter une étape supplémentaire à votre processus de génération pour générer le code et vous assurer que toute l’équipe reçoit le mémo. Dans le pire des cas, vous devez également lancer votre propre générateur de code ou votre propre modèle.
Cela vous laisse avec réflexion. Vous pouvez le faire vous-même ou utiliser AutoMapper.
la source
Automapper est l'une de ces bibliothèques / outils où l'empereur tourne littéralement autour de lui. Lorsque vous dépassez le logo fastueux, vous réalisez qu'il ne fait rien que vous ne puissiez faire manuellement avec de bien meilleurs résultats.
Bien que je ne sois pas tout à fait certain de la manière dont cela se réfère aux membres auto-mappés, cela implique probablement une logique d'exécution supplémentaire et une réflexion possible. Cela peut constituer une pénalité de performance significative en échange d’un gain de temps. En revanche, le mappage manuel est exécuté bien avant la compilation.
Dans les cas où AutoMapper n'a aucune idée, vous devez configurer le mappage avec du code et des indicateurs de réglage. Si vous voulez vous occuper de tout l’installation et le travail du code, vous devez vous demander combien cela économise par rapport au mappage manuel.
la source