微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – Web服务代理类实现接口

我正在寻找一种方法生成的Web引用代理类(而不是WCF)实现一个通用接口,以便在客户端应用程序中轻松切换Web服务访问和“直接”访问我们的业务层,如:
public IBusiness GetBusinessObject()
{
  if (_mode = "remote")
    return new BusinessWebService.Business(); // access through web service proxy class
  else
    return new Business(); // direct access
}

但是,生成的代理类中未引用自定义类型(例如,下面示例中的CustomSerializableType).而是生成新的相同类型,这使得代理类无法实现接口.

是否有某种方法可以使生成的代理类引用这些类型,或者我是否会将此全部错误?我应该考虑将Web服务转换为WCF服务吗?

细节

我们的解决方包括以下四个项目:

>业务库(包含业务逻辑,访问数据存储)
>公共库(包含常用功能,包括CustomSerializableType)
> Web服务(充当远程客户端和业务层之间的代理)
>一个Windows应用程序

我们的客户希望Windows应用程序能够以两种不同的模式运行:

>本地模式,应用程序只是直接使用业务库来访问数据
>远程模式,应用程序与Web服务通信以访问数据

为此,我们创建了一个IBusiness接口,它位于公共库中,包含所有业务方法.

接口

public interface IBusiness
{
  CustomSerializableType DoSomeWork();
}

业务层

public class Business : IBusiness
{
  public CustomSerializableType DoSomeWork()
  {
    // access data store
  }
}

网络服务

public class WebServiceBusiness : IBusiness
{
  private Business _business = new Business();

  [WebMethod]
  public CustomSerializableType DoSomeWork()
  {
    return _business.DoSomeWork();
  }
}

生成的代理类(为了便于阅读,省略了大量代码)

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
  }
}

解决方法

假设您的客户端的认命名空间是“Client”,并且您的Web引用名为“Proxy”,则执行以下操作:

>在客户端项目的根目录中,创建名为“Proxy”的文件夹.
>在该文件夹中,创建一个名为“Business”的类.
>使该类公开和部分,并使其实现您的IBusiness接口

这样,您无需修改​​Reference.cs.您永远不应该修改Reference.cs或通过代码生成生成的任何其他文件.

请注意,这会将客户端与服务紧密绑定,从而违反SOA的原则.至少,您应该在单独的项目中定义这些接口,以便您只共享客户端和服务之间的“接口”项目.

原文地址:https://www.jb51.cc/csharp/100039.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐