2011-04-08 52 views
0

我有一个监视应用程序,通过WCF从其他应用程序接收处理更新。以前,被监控的应用程序有一个“更新”类来将数据发送到监控应用程序。现在我正在写一个抽象基类,看起来像这样WCF抽象基类及其子类上的DataContract

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属性标记,或者只需要我的子?如果是这样的话,我还可以装点TimeStampAppIdDataMemeber没有DataContract和监控应用程序仍然可以访问这些属性?

回答

1

我认为在WFC推荐是经由接口进行通信。在你的情况,这将意味着使接口的TimeStampAppId属性(装饰与DataContract),并与DataMember装饰他们,那么你应该在Update实现此接口。

在你所谈论的,如果你希望能够看到在WCF Update对象,那么你需要用DataContract来装饰它,如果你希望能够看到只读域,那么你需要装饰的情况他们与DataMember

+0

好吧,如果我得到这个权利,Update和ProcessUpdate需要DataContract。虽然IUpdate在其属性上需要DataMember。那是对的吗? – jlafay 2011-04-08 19:45:36

+0

或者我可以用DataContract装饰ProcessUpdate,因为Update永远不会通过电线。 – jlafay 2011-04-08 19:51:05

0

你必须标记与DataContract和您想要传送的数据成员所有成员的所有类。 此外,您必须使用NetDataContract序列化程序,否则您将无法通过WCF传输类层次结构或接口。

对于使用NetDataContractSerializer的例子:WCF Net Data Contract Serializer

1

您可以ServiceKnownType标记服务讲述的子类,这将使当您发送从更新派生的东西它的工作的客户端。

至于,更新标记为抽象的客户端上没有如果您使用的是基于XML的服务。另一方面,它不会将更新视为摘要。

+0

它不应该看到一个Update对象,因为你不能在抽象类上实例化。它会工作,如果WCF将对象作为IUpdate? – jlafay 2011-04-09 15:21:22

+0

这不是它的工作原理。如果你有一个返回Update的方法,即使Update是抽象的,在XML服务的另一端他们将看到Update并能够创建它。当客户端代理被创建时,这些细节不会跨越这些细节。 – Tridus 2011-04-09 21:46:17