2011-04-08 53 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