我正在寻找一种方法让生成的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
)我们的客户希望Windows应用程序能够以两种不同的模式运行:
为此,我们创建了一个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
}
}
答案 0 :(得分:6)
假设您的客户端的默认命名空间是“Client”,并且您的Web引用名为“Proxy”,请执行以下操作;
IBusiness
接口这样,您无需修改Reference.cs。您应该从不修改Reference.cs,或通过代码生成生成的任何其他文件。
请注意,这会将客户端与服务紧密绑定,从而违反SOA的原则。至少,您应该在单独的项目中定义这些接口,以便您只共享客户端和服务之间的“接口”项目。