我正在寻找一种方法,使得Web Reference(不是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
}
}
Web服务
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
}
}