Upcasting ServiceContract

时间:2010-06-04 16:15:10

标签: c# interface wcf wcf-client

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

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

要切入问题,请考虑以下代码示例:

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

[ServiceContract]
public interface IExtendedServer : IServer
{
    [OperationContract]
    void ExtendedOperation();
}

我想签订合同,以便应用程序具有扩展功能。换句话说,我希望能够在任何地方使用IServer契约,但允许类似插件的架构扩展基本契约接口,以便插件本身可以调用ExtendedOperation()操作契约。

那么,我如何构建我的代码,或者我必须做出哪些更改才能够执行如下操作? (频道属于IServer类型)

((IExtendedServer)channel).ExtendedOperation()

当我尝试这样做时,我收到错误

System.InvalidCastException:无法转换透明代理以键入“Contract.IExtendedServer”。

我希望我不会混淆......

2 个答案:

答案 0 :(得分:4)

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

我不知道如何在服务世界中创建类似插件系统的东西。插件在本地应用程序上运行良好 - 加载您的资源,语言扩展,图形过滤器 - 无论您喜欢什么。但是在SOA世界中,这种“敏捷性”与您尝试做的完全相反 - 创建并提供明确定义的,完全指定的服务。

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

所以我想说:如果你真的想要服务的灵活性,你需要检查基于REST的服务。 SOAP不符合该法案。转到MSDN上的WCF REST Developer Center,获取有关如何在WCF中使用REST的大量信息和资源。

答案 1 :(得分:0)

我不确定你要在这里完成什么。您正在处理具有暴露特定合同(即接口)的端点的服务。你不是在处理物品和铸造之类的东西;无论如何它都行不通,也不是正确的方法。

我看到它的方式,你所拥有的确实只是:一个服务使用一组公共操作公开一个端点,并且可能X个额外端点与其他具有扩展操作的合同。您可以在服务端拥有一个服务类,但就客户端而言,它们只是不同的端点/服务。