gpt4 book ai didi

c# - 如何强制 WebService 引用实现公共(public)接口(interface)?

转载 作者:太空狗 更新时间:2023-10-30 01:06:08 26 4
gpt4 key购买 nike

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

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

然后我让网络服务实现这个接口(interface):

[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 服务的引用而创建的内容的一部分)有一个服务器类的重新声明它没有声明 IDataAccessImplementation:

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

那么,我的问题是如何在不手动编辑文件 Reference.cs 的情况下使该引用实现通用接口(interface) IDataAccess?

最佳答案

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

接下来,请注意声明属于部分 类。您可以利用它来发挥自己的优势。

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

public partial class Server : SoapHttpClientProtocol, IDataAccess {}

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

private IDataAccess webService = new WebReference.Server();

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

关于c# - 如何强制 WebService 引用实现公共(public)接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16366932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com