我想使用抽象类将其定义为WCF的DataContract。以下示例显示了我如何定义抽象类UpperClass
。
[DataContract(IsReference = true)]
[KnownType(typeof(SubClass1))]
[KnownType(typeof(SubClass2))]
abstract public class UpperClass
{
abstract public void update();
}
SubClass1
和SubClass2
继承自UpperClass
。实际上,它们只共享一个名为update()
的方法,该方法仅在内部使用(不是DataMember)。以下代码显示了SubClass1
和SubClass2
的实现:
[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
答案 0 :(得分:0)
我将您的数据合同粘贴到WCF服务中并且它们工作正常,但我不建议在数据合同中使用业务逻辑(abstract public void update();)并超越服务边界。但这只是一种意见。