Sto cercando un modo per avere la classe proxy generata per un riferimento Web (non WCF) implementare un'interfaccia comune al fine di passare facilmente tra l'accesso al servizio Web e l'accesso "diretto" al nostro livello di business nell'applicazione client, qualcosa di simile:Classe proxy servizio Web per implementare l'interfaccia
public IBusiness GetBusinessObject()
{
if (_mode = "remote")
return new BusinessWebService.Business(); // access through web service proxy class
else
return new Business(); // direct access
}
Tuttavia, tipi personalizzati (ad esempio, il CustomSerializableType
negli esempi qui sotto), non si fa riferimento nella classe proxy generato. Invece vengono generati nuovi tipi identici, il che rende impossibile per la classe proxy implementare l'interfaccia.
C'è qualche modo per fare riferimento alla classe proxy generata di questi tipi, o sto andando tutto sbagliato? Dovrei prendere in considerazione la possibilità di convertire il servizio web in un servizio WCF?
dettagli
La nostra soluzione si compone di questi quattro progetti:
- Una libreria di business (contiene la logica di business, accessi archivio dati)
- una libreria comune (contiene comuni funzionalità, incluso il
CustomSerializableType
) - Un web ser Vice (funge da proxy tra i client remoti e lo strato di business)
- un'applicazione Windows
Il nostro cliente vuole l'applicazione di Windows per essere in grado di funzionare in due diverse modalità:
- modalità locale , dove l'applicazione utilizza semplicemente la biblioteca di business direttamente per accedere ai dati
- Modalità remota, dove l'applicazione comunica con il servizio web per accedere ai dati
Per fare ciò, abbiamo creato un'interfaccia, IBusiness, che si trova nella libreria comune e contiene tutti i metodi di business.
interfaccia
public interface IBusiness
{
CustomSerializableType DoSomeWork();
}
strato di business
public class Business : IBusiness
{
public CustomSerializableType DoSomeWork()
{
// access data store
}
}
servizio Web
public class WebServiceBusiness : IBusiness
{
private Business _business = new Business();
[WebMethod]
public CustomSerializableType DoSomeWork()
{
return _business.DoSomeWork();
}
}
generato classe proxy (una tonnellata di codice lasciato fuori per migliorare la leggibilità)
public partial class Business
: System.Web.Services.Protocols.SoapHttpClientProtocol
{
public CustomSerializableType DoSomeWork()
{
// ...
}
public partial class CustomSerializableType {
// PROBLEM: this new type is referenced, instead of the
// type in the common library
}
}
Si sta utilizzando svcutil.exe per generare le classi proxy? –
No, al momento sto solo usando gli strumenti integrati di Visual Studio 2010. Ho provato a fare un pasticcio con wsdl.exe, ma non ha risolto i miei problemi. Svcutil.exe è un'alternativa migliore? Non mi richiederebbe l'aggiornamento ai servizi WCF, invece dei servizi Web "legacy"? – bernhof