4

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

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

我让网络服务实现了这个接口:

[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 服务的引用创建的一部分,有一个 Server 类的重新声明,它没有t 声明 IDataAccessImplementation:

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

所以,我的问题是如何在不手动编辑文件 Reference.cs 的情况下使该参考实现该通用接口 IDataAccess?

4

1 回答 1

5

首先,你真的不需要在服务器端实现接口——这对生成的代码没有任何作用。

接下来,请注意声明是部分类的。你可以利用它来发挥你的优势。

您需要做的就是创建另一个C# 文件,该文件具有:

public partial class Server : SoapHttpClientProtocol, IDataAccess {}

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

private IDataAccess webService = new WebReference.Server();

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

于 2013-05-03T20:27:01.397 回答