WCF中合同的继承

时间:2011-08-05 11:19:38

标签: .net wcf inheritance interface

我在测试工具中有几个WCF服务,这些服务具有一些类似的功能,比如正在测试的分布式系统的启动/停止/清理部分。我不能使用通用合同来做到这一点 - 分布式系统的每个部分都有不同的步骤用于这些操作。

我正在考虑定义基本接口并从中导出当前的WCF接口。

例如:

interface Base
{
    void BaseFoo();
    void BaseBar();
    ...
}

interface Child1:Base
{
    void ChildOperation1();
    ...
}

interface Child2:Base
{
    void ChildOperation2();
    ...
}

我现在拥有的是每个子界面中定义的启动/停止/清理操作。

我应该在基础界面中提取类似的功能,还是有其他解决方案?我在WCF中继承合同会有任何问题吗?

1 个答案:

答案 0 :(得分:20)

服务合同接口可以相互派生,使您可以定义层次结构 合同但是,ServiceContract attribute is not inheritable

[AttributeUsage(Inherited = false,...)]
public sealed class ServiceContractAttribute : Attribute
{...}

因此,接口层次结构中的每个级别都必须明确拥有服务 合同属性。

服务端合同层次结构:

[ServiceContract]
interface ISimpleCalculator
{
    [OperationContract]
    int Add(int arg1,int arg2);
}
[ServiceContract]
interface IScientificCalculator : ISimpleCalculator
{
    [OperationContract]
    int Multiply(int arg1,int arg2);
}

在实现合同层次结构时,可以实现单个服务类 整个层次结构,就像经典的C#编程一样:

class MyCalculator : IScientificCalculator
{
    public int Add(int arg1,int arg2)
    {
        return arg1 + arg2;
    }
    public int Multiply(int arg1,int arg2)
    {
        return arg1 * arg2;
    }
}

主机可以为层次结构中最底层的接口公开单个端点:

<service name = "MyCalculator">
    <endpoint
    address = "http://localhost:8001/MyCalculator/"
    binding = "basicHttpBinding"
    contract = "IScientificCalculator"
    />
</service>

您不必担心合同层级 灵感来自Juval Lowy WCF book