2010-10-22 7 views
5

Ma question pourrait être stupide, mais je suis sûr que je manque une partie très importante du problème. Je dois faire un objet de mappage d'objet (entre les classes de domaine utilisées dans le projet C# et les classes qui sont envoyées aux clients Flash).Quels sont les avantages d'utiliser automapper?

Mon premier choix était Automapper. Mais j'ai eu quelques problèmes avec lui (propriétés imbriquées, constructeur non paramétrable défini). Il s'avère qu'il n'est pas si facile de mapper un type vraiment complexe avec automapper.

Alors ma question est: Pourquoi ne pas mettre en œuvre des méthodes telles que:

ClassA GetClassAByClassB(ClassB pObj) 

    { 
    ClassA objA = new ClassA(); 
    objA.Prop1 = pObj.Prop1; 
    objA.NestedType.Prop2 = pObj.Prop2; 
    //....Some more..... 
    return objA; 
    } 

Il a exactement le même niveau de flexibilité comme la cartographie effectuée à l'aide Automapper. Vous devez toujours indiquer quelle propriété de l'objet source est copiée dans quelles propriétés dans l'objet destinations. Vous faites cela en utilisant '=' et non pas l'expression lambda.

Mais si vous changez quelque chose dans vos classes de domaine, vous devez quand même modifier cette partie "mapping". Alors quelle est la principale chose qui devrait me convaincre d'utiliser Automapper (comme je l'ai dit au début, je suis sûr que je manque quelque chose d'important).

Répondre

3

Parce qu'avec AutoMapper vous n'avez pas doivent mettre en œuvre ces méthodes de

Votre approche nécessite l'écriture d'un grand nombre de

classA.propA = classB.propA; 
classA.propB = classB.propB; 
classA.propC = classB.propC; 
classA.propD = classB.propD; 
classA.propE = classB.propE; 

AutoMapper utilise des conventions pour le comprendre lui-même. Qui plus est, vous n'avez pas à vous soucier de pObj == null (votre code lancera NulLReferenceException dans ce cas).

Vous pouvez également définir des conversions dans votre carte (par exemple, une chaîne de caractères en DateTime). AutoMapper prend également en charge les propriétés imbriquées.

En savoir plus ici: AutoMapper Introduction and Samples

+0

Qu'en est-il des propriétés qui n'ont pas le même nom? Et les propriétés imbriquées? Je pense que je devrais changer les conventions, mais parfois la propriété d'un côté est «PositionX» et de l'autre côté «X». (Juste un exemple - les propriétés anmes peuvent être assez imprévisibles). Donc, n'est-ce pas comme si je ne devais pas utiliser Automapper dans mon cas? – Katalonis

+0

@Katalonis - Ensuite, vous configurez le mappeur de manière sécurisée en utilisant lambdas. Ajout d'un exemple de code et d'un lien. –

1

L'un des avantages que AutoMapper prétend avoir est la cartographie par convention. Voici une citation de "AutoMapper Introduction and Samples"

« est là que réside la beauté de AutoMapper. Lorsque vos classes alignent conventionnellement eux-mêmes, la configuration de votre carte peut être aussi simple »

Cet avantage est livré avec un coût. Renommer ou modifier à la fois la propriété cible et la propriété source va rompre le mappage et introduire des bogues d'exécution plutôt que de compiler des erreurs.

Si vous ne pouvez pas vous fier au mappage de convention, AutoMapper perd son avantage. Dans ce cas, je préfère écrire une fonction d'usine comme ci-dessous.

public static ClassA MapToClassA(this ClassB b) 
{ 
    return new ClassA() 
    { 
     propA = b.propA; 
     propB = b.propB; 
     propC = b.propC; 
    } 
} 

Ensuite, vous construire l'objet de destination comme

var classA = classB.MapToClassA(); 

au lieu de

var classA = Mapper.Map<ClassB, ClassA>(classB) 

Personnellement, je préfère les fonctions d'usine, même si la cartographie des congrès est possible pour sa explicitation, la lisibilité et déboguer la convivialité. Bonne chance pour essayer de découvrir, dans le second cas, comment ClassB est mappé à ClassA, si le profil de mappage est chargé, ou pourquoi il existe une exception lorsque la fonction Map <>() est appelée, ou pourquoi certaines propriétés ont reçu une valeur erronée.

Questions connexes