Domanda

Sono ancora nuovo nel mondo ASP.NET, quindi potrei essere molto fuori base qui, ma finora questo è il meglio delle mie (limitate) conoscenze!

Diciamo che ho un oggetto business standard "Contatto" nel file Attività commerciale spazio dei nomi.Scrivo un servizio Web per recuperare le informazioni di un contatto da un database e restituirle.Quindi scrivo un'applicazione client per richiedere tali dettagli.

Ora, creo anche un metodo di utilità che prende un "Contatto" e fa un po' di magia con esso, ad esempio Utils.BuyContactNewHat() Dire.Che ovviamente accetta il tipo Contact Business.Contact.

Quindi torno alla mia applicazione client e desidero utilizzare il file BuyContactNewHat metodo, quindi aggiungo un riferimento a my Utilità spazio dei nomi ed eccolo lì.Tuttavia si pone un problema con:

Contact c = MyWebService.GetContact("Rob);
Utils.BuyContactNewHat(c); // << Error Here

Dal momento che il tipo di reso di GetContact è di MyWebService.Contact e non Business.Contact come previsto.Capisco il motivo per cui quando accedi a un servizio Web, stai effettivamente programmando contro la classe proxy generata dal WSDL.

Quindi, esiste un modo "più semplice" per gestire questo tipo di mancata corrispondenza?Stavo pensando di provare a creare una classe di convertitore generica che utilizzi la riflessione per garantire che due oggetti abbiano la stessa struttura rispetto al semplice trasferimento dei valori dall'uno all'altro.

È stato utile?

Soluzione

Sei sulla strada giusta.Per riportare i dati dall'oggetto proxy in uno dei tuoi oggetti, devi eseguire il codice da sinistra a destra.cioè.copiare i valori delle proprietà.Scommetto che esiste già un metodo generico che utilizza la riflessione.

Alcune persone utilizzeranno qualcosa di diverso da un servizio Web (comunicazione remota .net) se desiderano semplicemente trasmettere un oggetto aziendale attraverso la rete.Oppure utilizzeranno la serializzazione binaria.Immagino che tu stia utilizzando il servizio web per un motivo, quindi dovrai copiare la proprietà.

Altri suggerimenti

In realtà non è necessario utilizzare la classe generata fornita da WSDL.Se dai un'occhiata al codice che genera, si tratta semplicemente di effettuare chiamate in alcune classi .NET Framework per inviare richieste SOAP.In passato ho copiato quel codice in un normale file .cs e l'ho modificato.Anche se non l'ho provato in modo specifico, non vedo alcun motivo per cui non sia possibile eliminare la definizione della classe proxy e utilizzare la classe originale per ricevere i risultati della chiamata SOAP.Deve già esserci una riflessione sotto il cofano, sembra un peccato farlo due volte.

Ti consiglio di provare a scrivere un'estensione per l'importazione di schemi, che puoi utilizzare per controllare la generazione del codice proxy.Questo approccio può essere utilizzato per risolvere (con garbo) il problema senza problemi (come copiare oggetti da uno spazio dei nomi a un altro o modificare la classe reference.cs generata dal proxy solo per sostituirla la prossima volta che si aggiorna il riferimento web).

Ecco un (molto) buon tutorial sull'argomento:

http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top