基于抽象基类及其子类的WCF数据契约
本文关键字:子类 WCF 契约 数据 基类 于抽象 抽象 | 更新日期: 2023-09-27 17:49:36
我有一个监控应用程序,通过WCF接收来自其他应用程序的处理更新。以前被监控的应用程序有一个"更新"类来发送数据到监控应用程序。现在我正在编写一个抽象基类,看起来像这样
public abstract class Update
{
public readonly DateTime TimeStamp;
public readonly int AppId;
public Update()
{
TimeStamp = DateTime.Now;
AppId = SomeMethodThatCalculatesId();
}
private int SomeMethodThatCalculatesId()
{
// my calculations ...
}
}
下面是一个示例子类
public class ProcessUpdate : Update
{
public readonly string ProcessMessage;
public ProcessUpdate(string processMessage) : base()
{
if (string.IsNullOrEmpty(processMessage))
{
throw new ArgumentNullException("processMessage");
}
ProcessMessage = processMessage;
}
}
我希望能够发送任何来自Update
的监控应用程序,并希望防止更新被实例化,这就是为什么它是抽象的。我想要一个实现为我的AppId生成和派生类不担心它或改变它,这就是为什么AppId是只读的。
Update
需要DataContract
属性标签还是只需要我的子类?如果是这样的话,我仍然可以用DataMemeber
装饰TimeStamp
和AppId
,而不使用DataContract
,并且仍然可以在监控应用程序中访问这些属性吗?
我认为WFC的建议是通过接口进行通信。在你的情况下,这意味着使TimeStamp
和AppId
的接口属性(用DataContract
装饰)和DataMember
装饰它们,然后你应该在Update
实现这个接口。
在你所说的情况下,如果你想在WCF上看到Update
对象,那么你需要用DataContract
来装饰它,如果你想能够看到只读字段,那么你需要用DataMember
来装饰它们。
您可以使用ServiceKnownType标记服务,以告诉客户端有关子类的信息,这将使它在发送update派生的内容时能够工作。
至于在客户端将Update标记为抽象,如果您使用基于XML的服务则不是。另一方面,它不把Update看作抽象的
必须将所有类标记为DataContract,并将所有想要传输的成员标记为DataMember。此外,您必须使用NetDataContract序列化器,否则您将无法通过WCF传输类层次结构或接口。
使用NetDataContractSerializer的示例:WCF . NetDataContractSerializer