Je cherche un moyen de faire en sorte que la classe proxy générée pour une référence Web (pas WCF) implémente une interface commune afin de basculer facilement entre l'accès au service Web et l'accès "direct" à notre couche métier dans l'application cliente, quelque chose comme:Classe de proxy Web Service pour implémenter l'interface
public IBusiness GetBusinessObject()
{
if (_mode = "remote")
return new BusinessWebService.Business(); // access through web service proxy class
else
return new Business(); // direct access
}
Cependant, les types personnalisés (par exemple le CustomSerializableType
dans les exemples ci-dessous) ne sont pas mentionnés dans la classe proxy générée. Au lieu de cela, de nouveaux types identiques sont générés, ce qui empêche la classe proxy d'implémenter l'interface.
Existe-t-il un moyen de faire référence à ces types de classes proxy générées, ou est-ce que je vais tout à fait mal? Dois-je envisager de convertir le service Web en un service WCF à la place?
Détails
Notre solution consiste à ces quatre projets:
- Une bibliothèque d'affaires (contient la logique métier, les accès magasin de données)
- Une bibliothèque commune (contient commune fonctionnalité, y compris le
CustomSerializableType
) - Un web ser vice (agit comme un proxy entre clients distants et la couche d'affaires)
- fenêtres d'une application
Notre client souhaite l'application Windows pour pouvoir fonctionner dans deux modes différents:
- mode local , où l'application utilise simplement la bibliothèque d'affaires directement aux données d'accès
- mode distant, où l'application communique avec le service Web pour accéder aux données
Pour ce faire, nous avons créé une interface, IBusiness, qui se trouve dans la bibliothèque commune et contient toutes les méthodes de gestion.
Interface
public interface IBusiness
{
CustomSerializableType DoSomeWork();
}
couche d'affaires
public class Business : IBusiness
{
public CustomSerializableType DoSomeWork()
{
// access data store
}
}
service Web
public class WebServiceBusiness : IBusiness
{
private Business _business = new Business();
[WebMethod]
public CustomSerializableType DoSomeWork()
{
return _business.DoSomeWork();
}
}
classe proxy généré (une tonne de code de gauche pour la lisibilité)
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
}
}
Utilisez-vous svcutil.exe pour générer les classes de proxy? –
Non, pour le moment je n'utilise que des outils intégrés Visual Studio 2010. J'ai essayé de déconner un peu avec wsdl.exe, mais cela n'a pas résolu mes problèmes. Svcutil.exe est-il une alternative? Cela ne m'obligerait-il pas à passer aux services WCF, au lieu des services Web «hérités»? – bernhof