9 messaggi dal 26 marzo 2008
Ciao a tutti, avrei bisogno di consigli su come gestire un problema architetturale:
Ho 4 classi molto corpose di gestione di un web service (AXL di cisco), generate tramite il tool wsdl. Le 4 classi differiscono per 2 parametri: la versione del Call Manager a cui mi devo connettere e un altro parametro (svn) che vale true o false a seconda di come è impostato sul CM.
Questi parametri sono impostati come attributi dei metodi da chiamare (es):

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("CUCM:DB ver=6.1 addAARGroup", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
[return: System.Xml.Serialization.XmlElementAttribute("addAARGroupResponse", Namespace="http://www.cisco.com/AXL/API/6.1")]
public StandardResponse addAARGroup([System.Xml.Serialization.XmlElementAttribute("addAARGroup", Namespace="http://www.cisco.com/AXL/API/6.1")] addAARGroupReq addAARGroup1) {

I metodi e le sottoclassi che hanno questi attributi sono veramente tanti e non vorrei modificare ilcodice generato (in vista anche del fatto che una nuova versione del Cm darà origine ad una nuova classe)...
Vorrei creare una classe contenitore generica che in base ai due parametri (versione e SVN) istanzi la classe corretta e chiami i metodi con i dati corretti, per rendere il tutto trasparente al chiamante.
Spero di essermi spiegata...
Grazie per i consigli.
Uff, cavoli.. no, non mi è chiaro, sorry! Se riesci a spiegarmi meglio la cosa provo a darti una mano
9 messaggi dal 26 marzo 2008
Si hai ragione. Cerco di spiegarmi meglio:
Le propietà e i metodi delle classi generate tramite il tool wsdl (che mi servono per accedere ad un web service), contengono tutti i seguenti attributi:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("CUCM:DB ver=6.1 addPhone", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
[return: System.Xml.Serialization.XmlElementAttribute("addPhoneResponse", Namespace = "http://www.cisco.com/AXL/API/6.1") ]
I dati che ho evidenziato però, che dipendeono dalla versione del vendor che mi fornisce il web service e da un parametro configurato sul server, li vorrei rendere configurabili...

I valori possibili per ora sono le 4 combinazioni dei due parametri:
- v 6.1 e namespace = http://www.cisco.com/AXL/API/6.1
- v 6.1 e namespace = http://www.cisco.com/AXL/6.1
- v 1.0 e namespace = http://www.cisco.com/AXL/API/1.0
- v 1.0 e namespace http://www.cisco.com/AXL/1.0

La prima cosa che mi è venuta in mente è di crere 4 classi (con lo stesso nome ma namespace diverso) con gli attributi diversi e una classe generica che istanzia le 4 classi a seconda di alcuni parametri, ma la cosa non mi piace molto perchè se esce una nuova versione devo aggiungere altre classi e poi devo inserire un sacco di if..
So che potrei accedere agli attributi tramite la Reflection...Vi poosto un esempio:

AXL10.AuthenticateUserReq req = new AXL10.AuthenticateUserReq();
req.userid = userid;
req.ItemElementName = AXL10.ItemChoiceType42.pin; // "pinCredPolicyName";
req.Item = pin;

AXL10.AuthenticateUserResponse res = _axlas10.doAuthenticateUser(req);

return res.@return.userAuthenticated;

per la versione 6.1 sarbebbe invece:

AXL61NSV.AuthenticateUserReq req = new AXL61NSV.AuthenticateUserReq();
req.userid = userid;
req.ItemElementName = AXL61NSV.ItemChoiceType42.pin; // "pinCredPolicyName";
req.Item = pin;

AXL61NSV.AuthenticateUserResponse res = _axlas.doAuthenticateUser(req);

if (res != null)
return res.@return.userAuthenticated;

Spero di essere stata + chiara.
wsdl.exe genera una serie di classi partial, che quindi possono essere estese in file separati.

A questo punto, fossi in te, io creerei le 4 classi e farei implementare loro (in file esterni, così che se riesegui wsdl.exe non devi metter mano sul codice autogenerato dei proxy) un'interfaccia con i membri comuni, che poi sono quelli che utilizzi in ogni invocazione.

Ovviamente lo stesso devi fare per la classe che rappresenta il risultato dell'invocazione.

L'unico potenziale problema è insito nella riga
req.ItemElementName = AXL61NSV.ItemChoiceType42.pin; // "pinCredPolicyName";

visto che dalla sintassi
AXL61NSV.ItemChoiceType42.pin

mi sembra essere un enumerato, che sarebbe pertanto un tipo diverso ad ogni invocazione. Qui, ad es., se nella tua invocazione usi sempre "pin", puoi creare un metodo SetItemElementName nell'interfaccia che wrappi quello statement, o creare un enum "standard" da utilizzare come argument per questo metodo.

A questo punto il tuo codice diventerebbe qualcosa tipo...
IAuthenticateUserReq req = AuthenticateUserReqFactory.GetProxy(version, namespace);
req.userid = userid;
req.SetupItemElementName();
req.Item = pin;

IAuthenticateUserResponse res = _axlas.doAuthenticateUser(req);


Ti resta da wrappare il webservice in modo che doAuthenticateUser accetti l'interfaccia invece che il tipo concreto. La factory AuthenticateUserReqFactory puoi anche implementarla brutalmente con qualche if, tanto restano concentrati al suo interno. In questo modo all'aggiunta di nuove versioni non devi far altro che far implementare l'interfaccia nelle opportune classi proxy e aggiungerle all'interno della factory stessa.

So che richiede un certo lavoro, vedi te se il gioco vale la candela :-)

A presto,
m.
9 messaggi dal 26 marzo 2008
Grazie per la risposta. Avevo in mente anche io qualcosa del genere, ma le funzioni, le classi e i tipi enum da modificare sarebbero almeno un centinaio...in effetti devo valutare se ne vale la pena.
Grazie e ciao, Stefania.
Eh... dal tuo post sembrava più ridotta la cosa  Allora valuterei l'idea di creare dei wrapper autonomi dell'intera invocazione al servizio, tutti isomorfi (es. derivano dalla stessa baseclass o implementano un'interfaccia comune), da costruire tramite una factory.

Ciao,
m.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
In primo piano

I più letti di oggi

Media
In evidenza
MISC