如何强制Web Service引用实现通用接口?

时间:2013-05-03 20:20:16

标签: c# asp.net web-services

我正在使用.net网络服务创建一个研究项目,我遇到了这个问题: 为了提供改变Web服务器的机会,甚至是它的性质(这是任务的一部分),我在一个单独的.dll中创建了一个接口,每个可能的(Web)服务都必须实现。说,

public interface IDataAccess
{
    // Group of methods which are used for login/logout
    bool isUserRegistered(string username);
    bool authorize(string username, string password);
    //...
}

我让Web服务实现了这个界面:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class Server : System.Web.Services.WebService, IDataAccess
{
    //...
}

然后,在客户端中,我为此服务创建一个引用(名称空间WebReference),指定在所有程序集中重用类型并尝试执行以下操作:

private IDataAccess webService = (IDataAccess)(new WebReference.Server());

但是这个赋值在运行时抛出异常,说明无法完成转换,实际上,在Reference.cs中(这是通过添加对Web Service的引用而创建的内容的一部分,还有一个Server类的重新声明它没有声明IDataAccessImplementation:

public partial class Server : System.Web.Services.Protocols.SoapHttpClientProtocol {
    //...
}

那么,我的问题是如何在没有手动编辑Reference.cs文件的情况下使这个参考工具成为通用接口IDataAccess?

1 个答案:

答案 0 :(得分:5)

首先,您确实不需要在服务器端实现接口 - 这对生成的代码不起任何作用。

接下来,请注意声明属于部分类。你可以利用这个优势。

您需要做的就是创建另一个 C#文件,其中包含:

public partial class Server : SoapHttpClientProtocol, IDataAccess {}

你需要所有(在正确的命名空间和正确的using指令中)。没有代码 - 这些都是在生成的类中提供的。 C#编译器将混合两个声明,然后你可以使用:

private IDataAccess webService = new WebReference.Server();

...或者更好的是,通过构造函数注入它,以便您可以编写完全不需要使用实际实现的测试!