Estoy buscando una forma de tener la clase proxy generada para una referencia web (no WCF) implementar una interfaz común para cambiar fácilmente entre el acceso al servicio web y el acceso "directo" a nuestro capa de negocio en la aplicación cliente, algo así como:Clase proxy del servicio web para implementar la interfaz
public IBusiness GetBusinessObject()
{
if (_mode = "remote")
return new BusinessWebService.Business(); // access through web service proxy class
else
return new Business(); // direct access
}
sin embargo, los tipos personalizados (por ejemplo, el CustomSerializableType
en los ejemplos siguientes) no se hace referencia en la clase de proxy generada. En su lugar, se generan tipos nuevos e idénticos, lo que hace imposible que la clase proxy implemente la interfaz.
¿Hay alguna manera de hacer que la clase de proxy generada haga referencia a estos tipos, o me estoy equivocando? ¿Debo considerar convertir el servicio web a un servicio WCF?
detalles
Nuestra solución consiste en estos cuatro proyectos:
- Una biblioteca de negocios (contiene la lógica de negocio, los accesos de almacén de datos)
- una biblioteca común (contiene común funcionalidad, incluido el
CustomSerializableType
) - Un servidor web vice (actúa como un proxy entre clientes remotos y la capa de negocio)
- una aplicación de Windows
Nuestro cliente quiere que el uso de las ventanas para poder funcionar en dos modos diferentes:
- modo local , donde la aplicación simplemente usa la biblioteca comercial directamente para acceder a los datos
- Modo remoto, donde la aplicación se comunica con el servicio web para acceder a los datos
Para ello, hemos creado una interfaz, IBusiness, que se encuentra en la biblioteca común y contiene todos los métodos comerciales.
interfaz
public interface IBusiness
{
CustomSerializableType DoSomeWork();
}
capa de negocios
public class Business : IBusiness
{
public CustomSerializableType DoSomeWork()
{
// access data store
}
}
servicio web
public class WebServiceBusiness : IBusiness
{
private Business _business = new Business();
[WebMethod]
public CustomSerializableType DoSomeWork()
{
return _business.DoSomeWork();
}
}
generada clase proxy (una tonelada de código dejado fuera para facilitar la lectura)
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
}
}
¿Está utilizando svcutil.exe para generar las clases de proxy? –
No, en este momento solo estoy usando las herramientas integradas de Visual Studio 2010. Intenté jugar un poco con wsdl.exe, pero no resolvió mis problemas. ¿Es svcutil.exe una mejor alternativa? ¿No me requeriría eso actualizar a los servicios de WCF, en lugar de los servicios web 'heredados'? – bernhof