C# 升级服务合同

C# 升级服务合同,c#,interface,wcf,wcf-client,C#,Interface,Wcf,Wcf Client,我有一个WCF服务,它公开了许多方法 我的应用程序使用此服务,而ServiceContract仅包括某些方法的OperationContract定义 为了解决这个问题,考虑下面的代码示例: [ServiceContract] public interface IServer { [OperationContract] void BasicOperation(); } [ServiceContract] public interface IExtendedServer : ISe

我有一个WCF服务,它公开了许多方法

我的应用程序使用此服务,而ServiceContract仅包括某些方法的OperationContract定义

为了解决这个问题,考虑下面的代码示例:

[ServiceContract]
public interface IServer
{
    [OperationContract]
    void BasicOperation();
}

[ServiceContract]
public interface IExtendedServer : IServer
{
    [OperationContract]
    void ExtendedOperation();
}
我想签订合同,使应用程序具有扩展能力。换句话说,我希望在任何地方都能使用IServer contract,但允许类似插件的体系结构扩展基本的contract接口,这样插件本身就可以调用
ExtendedOperation()
operation contract

那么,我该如何构造我的代码,或者,我必须做哪些更改,以便能够像下面这样做?(通道类型为IServer)

当我尝试这样做时,我得到了一个错误

System.InvalidCastException:无法将透明代理强制转换为类型“Contract.IExtendedServer”


我希望我没有混淆…

我不确定你在这里想要实现什么。您处理的是服务,这些服务的端点公开特定的契约(即接口)。你不是在处理物体和铸造之类的事情;这是行不通的,也不是正确的方法


在我看来,您所拥有的实际上只是:一个服务,它公开一个端点和一组公共操作,并可能公开X个额外端点和其他具有扩展操作的契约。您仍然可以在服务端使用单个服务类,但就客户端而言,它们只是不同的端点/服务。

我不确定您在这里要实现什么。您处理的是服务,这些服务的端点公开特定的契约(即接口)。你不是在处理物体和铸造之类的事情;这是行不通的,也不是正确的方法


在我看来,您所拥有的实际上只是:一个服务,它公开一个端点和一组公共操作,并可能公开X个额外端点和其他具有扩展操作的契约。您仍然可以在服务端使用单个服务类,但就客户端而言,它们只是不同的端点/服务。

SOA世界中的服务需要有一个定义良好且非常静态的接口。SOAP服务需要WSDL中的表示(以及所涉及数据的包含或单独的XSD=XML模式)

我不知道如何在服务世界中创建插件系统。插件在本地应用程序上工作得很好-加载你的资源、语言扩展、图形过滤器-任何你喜欢的东西。但在SOA世界中,这种“敏捷性”与您所要做的恰恰相反——创建并提供定义良好、完全指定的服务以供使用

我所能看到的唯一选择是使用基于REST的方法,因为在那里您实际上没有很多这样的限制。通常我会说,缺少正式的服务描述是REST的主要缺点和弱点之一,但由于使用REST,操作实际上只是由所使用的URL定义的,因此在您的情况下这可能是一个优点


所以我想说:如果您真的想要服务的灵活性,您需要查看基于REST的服务。肥皂不符合那个要求。有关如何在WCF中使用REST以及如何与WCF一起使用REST的大量信息和资源,请访问MSDN上的。SOA世界中的服务需要有一个定义良好且非常静态的接口。SOAP服务需要WSDL中的表示(以及所涉及数据的包含或单独的XSD=XML模式)

我不知道如何在服务世界中创建插件系统。插件在本地应用程序上工作得很好-加载你的资源、语言扩展、图形过滤器-任何你喜欢的东西。但在SOA世界中,这种“敏捷性”与您所要做的恰恰相反——创建并提供定义良好、完全指定的服务以供使用

我所能看到的唯一选择是使用基于REST的方法,因为在那里您实际上没有很多这样的限制。通常我会说,缺少正式的服务描述是REST的主要缺点和弱点之一,但由于使用REST,操作实际上只是由所使用的URL定义的,因此在您的情况下这可能是一个优点


所以我想说:如果您真的想要服务的灵活性,您需要查看基于REST的服务。肥皂不符合那个要求。有关如何在WCF中使用REST以及如何与WCF一起使用REST的大量信息和资源,请访问MSDN上的网站。

+1以提供经过深思熟虑的推理的特定替代方案。谢谢。我自己的推理有点含糊不清,有一些想法,但似乎不太靠谱,特别是经过很好的解释后。+1感谢您提供了详细的替代方案和深思熟虑的推理。谢谢。我自己的推理有点含糊不清,有一些想法,但似乎并不坚持,特别是在经过很好的解释之后。
((IExtendedServer)channel).ExtendedOperation()