3 votes

Ajout de conventions de typage de noms pour les types génériques dans le contrat WCF

J'ai un service WCF qui utilise des génériques dans son contrat de données, par exemple (simplifié) :

public GetDetails(StatusField status);

Maintenant, WCF prend en charge les génériques en créant un type équivalent non générique pour chaque valeur possible de T dans le générique. Ainsi, pour l'exemple ci-dessus, le client consommant le service WCF verra la signature suivante pour la fonction ci-dessus :

public GetDetails(stringStatusField status);
//...

Maintenant, le client possède une copie de la version générique de la classe StatusField. Nous voulons utiliser AutoMapper dans le client, pour mapper entre ce StatusField générique et les types générés ci-dessus par WCF (comme stringStatusField) afin de pouvoir appeler le service. Nous pourrions le faire en créant manuellement les mappings au démarrage du client, comme ceci :

Mapper.CreateMap, stringStatusField>();

Cependant, c'est laborieux car il y a plus de 50 valeurs possibles de T que WCF a converties. En étendant cette idée, nous pourrions utiliser la réflexion pour créer automatiquement les mappings pour tous les types et c'est la solution que nous utilisons actuellement.

Idéalement, j'aimerais voir une solution qui s'intègre à l'architecture d'AutoMapper pour éviter d'avoir à faire la réflexion manuellement. Conceptuellement, cela nécessiterait une façon de définir une convention qu'AutoMapper utiliserait pour permettre de lier les deux types ensemble, de manière similaire à la façon dont il permet de spécifier des conventions personnalisées lors de la correspondance des propriétés. Jusqu'à présent, je n'ai pas vu de moyen de le faire et c'est la question que j'aimerais voir répondue ici, si quelqu'un sait comment cela peut être fait, en particulier en relation avec le scénario ci-dessus.

Au fait, je suis conscient que certains pourraient penser à Mapper.DynamicMap() comme une solution à ce problème. Tout d'abord, nous ne voulons pas l'utiliser car cela pourrait rendre le débogage potentiellement plus difficile (comme l'ont indiqué certains dans d'autres publications similaires à celle-ci) et aussi si le StatusField est profondément imbriqué dans un graphe d'objets transmis à la méthode WCF, je ne suis pas certain que cette solution fonctionnerait et pourrait potentiellement conduire à un mauvais mappage de types et à d'autres problèmes. J'aimerais vraiment définir de manière concrète les mappings autorisés, si possible.

0voto

James Webster Points 2590

Pas sûr si AutoMapper fournit le support que vous recherchez, mais si c'était le cas, il utiliserait la réflexion comme vous le proposez.

Si vous êtes opposé à la solution de réflexion en raison de préoccupations de performance (qui devrait être un coût de démarrage ponctuel), alors peut-être qu'une solution de génération de code basée sur un modèle T4 pourrait être intéressante à envisager?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X