2010-03-09 65 views
1

我不知道是否有可能,但我希望能夠從我的客戶端WCF服務中引用枚舉。我有一個核心項目,在該項目中的枚舉是:從wcf服務顯示枚舉客戶端

public enum StatusType 
{ 

    Ok = 1, 

    Error = 2, 
    Unknown = 0 

}

public enum DirectionType 
{ 
    None = 0, 
    ToSystem = 1, 
    FromSystem = 2 
} 

我使用一個服務項目的核心項目,它被設置在覈心項目喜歡的枚舉類型這樣的:

[DataContract()] 
static class EnumHelper 
{ 
    public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider) 
    { 
     List<Type> knownTypes = new List<Type>(); 

     // Add any types to include here. 
     knownTypes.Add(typeof(StatusType)); 
     knownTypes.Add(typeof(DirectionType)); 
     return knownTypes; 
    } 
} 

和接口:

[ServiceKnownType(typeof(EnumHelper))] 
[ServiceContract(SessionMode = SessionMode.Allowed)] 
public interface HandlerService 

當我調用接受或返回一個枚舉的方法時,它工作正常,但我必須引用客戶端項目中的核心項目以使用枚舉客戶端,我想從服務如果它是可能的。

我試圖在覈心項目的枚舉沒有效果設置爲

[DataContract] 
public enum StatusType 
{ 
    [EnumMember] 
    Ok = 1, /*!<Done with no error */ 
    [EnumMember] 
    Error = 2, /*!<Done with error */ 
    [EnumMember] 
    Unknown = 0, /*!<No data registered, default value */ 
} 

我想在我的客戶項目中使用這樣的:

要麼像client.StatusType.Ok或Servicereference1.StatusType.Ok或類似的東西, 音符像Core.StatusType.Ok

我想這樣做的原因是因爲服務應該用在不同的項目中,並且我們不希望每個人都依賴於一個普通的dll文件,如果有可能跳過它。我使用net.tcp綁定的服務。希望這是可以理解的,謝謝你的幫助:)

回答

0

如果你想在服務器和客戶端之間共享類型和類,你必須把它們放到一個單獨的程序集中,並在服務器和客戶端使用它。這隻有在你控制導線的兩端時纔有效,例如寫代碼的服務器端和客戶端(我相信你是)。

如果您在服務器端創建單獨的MyWCFTypes程序集,那麼您也可以在客戶端項目中引用該程序集,並且在導入服務定義時,WCF應重新使用現有的類,例如,應該重用您的MyWCFTypes類,而不必爲相同的枚舉創建新的類。

+0

感謝您的回答。我們考慮過將它放在單獨的程序集中,現在它可以正常工作,因爲正如您所提到的,我們控制着服務器和客戶端。但是,將來服務可能會完全公開,然後我們不希望使用服務的其他客戶依賴於單獨的類型組合。那可能嗎? – WcfEnum 2010-03-09 15:34:11

+0

@WcfEnum:否,如果您不能共享公共程序集,則無法使客戶端使用服務器類型。當添加服務引用時,他們將獲得他們自己的單獨類型的副本。 – 2010-03-09 16:55:54