2010-09-20 6 views
0

J'ai une méthode de service avec un couple de paramètres qui seront toujours fournis et des paramètres supplémentaires qui changeront par les noms et le nombre de paramètres (je saurai quels paramètres à attendre par le champ ACTION)Question de conception sur les services Web et WCF

Pour résoudre un problème de conception comme ci-dessus, j'ai créé un service Web avec les paramètres qui seront toujours fournis et un autre paramètre qui acceptera une chaîne qui est écrite avec une valeur Key < *>.

utilisant MyServiceMethod:

Action : Action1 
Param2: Hello 
param3: world 
Additional_Params: name<*>Jack;address<*>2 street; 

(je sais que, avec Action1 je reçois des valeurs Nom et adresse de la personne qui utilise le service)

utilisant MyServiceMethod pour la deuxième fois:

Action : Action5 
Param2: Hello 
param3: world 
Additional_Params: numOfHours<*>3;Sum<*>342;myName<*>asaf; 

Je pense que ce n'est pas la meilleure conception pour un service Web qui accepte des données différentes avec chaque ACTION, y at-il une meilleure façon de le faire?

+0

Combien d'actions différentes y a-t-il et à quelle fréquence changent-elles? –

+0

pas beaucoup d'actions, pas si souvent. – Rodniko

+0

Merci, j'ai écrit une réponse. –

Répondre

0

Je suis genre de déjà répondu dans les commentaires, mais ici, il est en un seul endroit:

Si vous avez un petit nombre de fonctions différentes, qui changent rarement, la meilleure façon est juste d'exposer chacun comme fonction séparée. Lorsque de nouveaux sont nécessaires, vous pouvez étendre votre interface sans casser le code existant. Par contre, si vous aviez un plus grand nombre de fonctions et/ou si elles changeaient fréquemment, une interface simple mais flexible serait préférable. Vous pourriez avoir une seule fonction exposée, en prenant un document XML qui est une sérialisation d'une requête DTO. Cela nécessitera une certaine logique de démultiplexage (commutateur/cas ou, mieux, une table de consultation des délégués) pour envoyer les demandes à un gestionnaire. Cette approche est plus difficile à mettre en place, mais plus facile à maintenir.

2

Si vous avez un petit ensemble d'actions, il serait probablement la meilleure stratégie de conception d'utiliser simplement une seule méthode pour chaque action. Cela ne demandera probablement pas autant de travail à l'arrière et, à mon avis, il n'y a pas de honte à cela.

Si vous avez un grand ensemble d'actions, vous pourriez être en mesure de représenter ce que vous voulez faire en tant que structure de données, et ne laisser passer que ce paramètre dans.

Je ne dirais pas la façon dont vous êtes proposer de le faire est mal, de toute façon, mais il peut en fait finir par créer plus de travail pour vous et être déroutant pour vous ou un autre développeur plus tard.

+0

Le problème n'est pas seulement la taille de l'ensemble mais sa variabilité. Si cela ne change jamais, alors même avoir un grand nombre de fonctions serait bien. –

2

Je ne suis pas 100% clair sur ce que vous essayez de faire, mais si vous savez que Action1 sera toujours appelé avec les paires nom/valeur de "nom" et "adresse", et Action5 sera appelé avec "numOfHours", "Sum" et "myName", alors je suis d'accord avec la réponse @Eugarps et le commentaire associé @Steven_Sudit. Il suffit de les exposer en tant que paramètres sur la méthode pour chaque action. Si toutefois, vous ne savez pas quels seront les paramètres de la variable (seulement vous obtiendrez certaines paires nom/valeur lors de l'appel des actions), alors j'utiliserais au moins un IDictionary<string, object> plutôt qu'une chaîne. Le faire de cette façon signifie que vous pouvez éviter l'analyse des valeurs de chaîne. Si les valeurs transmises sont des instances de vos propres types (plutôt que des primitives), vous devrez également utiliser l'attribut ServiceKnownType pour en informer le sérialiseur.

+0

Une autre façon d'aller est de changer l'interface pour accepter un document XML, qui lui-même peut être la sérialisation d'un DTO. –

+0

Je pense qu'une solution XML provoquera un très gros morceau de code pour vérifier la structure XML (xsd) et analyser le XML .... je ne sais pas .... – Rodniko

+0

puis-je passer IDictionary dans GET url? – Rodniko

Questions connexes