WCF:如何将抽象类用作DataContract

时间:2014-06-17 13:54:09

标签: c# wcf

我想使用抽象类将其定义为WCF的DataContract。以下示例显示了我如何定义抽象类UpperClass

[DataContract(IsReference = true)]
[KnownType(typeof(SubClass1))]
[KnownType(typeof(SubClass2))]
abstract public class UpperClass
{
    abstract public void update();
}

SubClass1SubClass2继承自UpperClass。实际上,它们只共享一个名为update()的方法,该方法仅在内部使用(不是DataMember)。以下代码显示了SubClass1SubClass2的实现:

[DataContract]
public class SubClass1 : UpperClass
{
    private int[] _val1;
    private int[] _val2;

    //internal constructor:
    public SubClass1()
    {
        _val1 = new int[2];
        _val2 = new int[2];

        //initialize values of _val1 and _val2 ...
    }

    //internal update method
    public override void update()
    {
        //here comes update formulas...
    }

    //enable simple access from WCF client:
    [DataMember]
    public int[] val1
    {
        get { return _val1; }
        set { _val1 = value; }
    }

    [DataMember]
    public int[] val2
    {
        get { return _val2; }
        set { _val2 = value; }
    }
}





[DataContract]
public class SubClass2 : UpperClass
{
    private int[] _value1;
    private int[] _value2;

    //internal constructor:
    public SubClass2()
    {
        _value1 = new int[12];
        _value2 = new int[12];
    }

    // ...

在服务器端,我使用以下代码提供我的服务,该代码在其Interface-class中定义为[OperationContract(IsInitiating = true,IsTerminating = false)]。

public UpperClass init(string s)
{
    if (s.Equals("SubClass1"))
        obj = new SubClass1();
    else if (s.Equals("SubClass2"))
        obj = new SubClass2();

    return obj;
}

在客户端,我使用以下方式使用(或初始化)我的服务:

UpperClass DatSet = proxy.init("SubClass1");

当我调试到此行的末尾时,DatSet的内容看起来很奇怪:

  

{MyExternalLayer.IMyProcessingLayer_proxy.SubClass1}       [MyExternalLayer.IMyProcessingLayer_proxy.SubClass1]:{MyExternalLayer.IMyProcessingLayer_proxy.SubClass1}       ExtensionData:{System.Runtime.Serialization.ExtensionDataObject}       extensionDataField:{System.Runtime.Serialization.ExtensionDataObject}       PropertyChanged:null

1 个答案:

答案 0 :(得分:0)

我将您的数据合同粘贴到WCF服务中并且它们工作正常,但我不建议在数据合同中使用业务逻辑(abstract public void update();)并超越服务边界。但这只是一种意见。