2011-12-02 100 views
1

我的客戶端有10個表,它需要通過內部WCF加載到服務器。由於所有這些都是內部的,我可以使用任何我想要的技術編寫客戶端和服務器。C# - WCF - 泛型 - [KnownType(typeof(xxx))]

在客戶端,我想使用LINQ從表中的數據裝載到一個列表,列表等等...

在服務器上,我認爲有一個[DataContract]如下:

[DataContract] 
[KnownType(typeof(Table1))] 
[KnownType(typeof(Table2))] 
[KnownType(typeof(Table3))] 
public class GenericType<T> 
{ 
    [DataMember] 
    public List<T> Data { get; set; } 
} 

然後添加代表客戶端上匹配表的類。

[DataContract] 
public class Table1 
{ 
    [DataMember] 
    public int UserID { get; set; } 
    [DataMember] 
    public string FullName { get; set; } 
} 

[DataContract] 
public class Table2 
{ 
    [DataMember] 
    public int UserID { get; set; } 
    [DataMember] 
    public string Address1 { get; set; } 
} 

[DataContract] 
public class Table3 
{ 
    [DataMember] 
    public string Name { get; set; } 
    [DataMember] 
    public string Description { get; set; } 
} 

當我創建客戶參考,我沒有收到服務器上聲明的所有類和似乎只有一日指定的[DataContract]變得對客戶可見[KnownType。

我的印象是,泛型是爲了允許多種類型我是真的認爲WCF只能處理一個[KnownType]×類

如果是這樣,我的唯一方法就是將複製並粘貼10次GenericType類,並在每個副本上更改[KnownType] ??

原因如果這是唯一的解決方案,那麼使用泛型的真正好處而不是直接定義列表,我的參數列表?

任何想法將有助於澄清這裏


時出現的問題我的腦海裏,因爲除非的WCF方法之一就是採用任何聲明爲[DataContract]類的......似乎WCF不會帶來那些客戶的課程。

這是預期的情況嗎?

+0

發佈預期總是好的! – esskar

+0

@esskar更新 –

+0

「我收到錯誤」。什麼是確切的錯誤?此外,KnownTypes「Table1」,「Table2」等也需要用[DataContract]和[DataMember]標記。 – ErnieL

回答

1

您可以嘗試將您的接口方法歸類爲每個類的ServiceKnownType屬性。

還有另一種選擇,這是落實在歸因與CollectionDataContract類泛型列表:

[CollectionDataContract] 
public class Table1Collection 
    Inherits List<Table1> 

在客戶端,您可以編輯Reference.svcmap並列舉每個集合中在CollectionMappings部分:

<CollectionMappings> 
    <CollectionMapping TypeName="My.Namespace.Table1Collection" Category="List" /> 

這樣您就可以重複使用的管的兩端具有相同的代碼。

+0

如果我實現了[CollectionDataContract],這是否意味着我必須創建10個不同的類,每個類指向一個不同的表格?如果是這樣,那麼效益在哪裏,而不是有10個類直接實現列表 ...等等? –

+0

如果您在集合類中有業務邏輯並且希望在客戶端和服務器中重複使用此邏輯,則只會從此方法中獲益。 –

+0

好點...再次感謝。 –