我有一个监控应用程序,通过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
派生的任何内容,并希望阻止Update被实例化,这就是为什么它是抽象的。我想为我的AppId生成实现一个实现,并且派生类不需要担心或改变它,这就是AppId只读的原因。
Update
是否需要DataContract
属性标记,还是只需要我的子类?如果是这种情况,我是否仍然可以使用TimeStamp
装AppId
和DataMemeber
而不使用DataContract
并仍在监控应用中访问这些属性?
答案 0 :(得分:1)
我认为WFC中的建议是通过接口进行通信。在您的情况下,这意味着制作界面的TimeStamp
和AppId
属性(使用DataContract
修饰)并使用DataMember
进行装饰,那么您应该在Update
中实现此接口{1}}。
在您谈论的情况下,如果您希望能够在WCF上看到Update
个对象,那么您需要使用DataContract
来装饰它,如果您希望能够看到只读字段,然后你需要用DataMember
装饰它们。
答案 1 :(得分:1)
您可以使用ServiceKnownType标记服务,告诉客户端子类,当您发送从更新派生的内容时,它应该可以使用它。
至于在客户端上将Update标记为抽象,而不是在使用基于XML的服务时。另一方面,它没有将Update视为抽象。
答案 2 :(得分:0)
您必须使用DataContract标记所有类,并将所有要传输的成员标记为DataMember。 此外,您必须使用NetDataContract序列化程序,否则您将无法通过WCF传输类层次结构或接口。
有关使用NetDataContractSerializer的示例:WCF Net Data Contract Serializer