2009-12-01 34 views
3

我一個遠程接口轉換爲WCF,但我有一個聲明爲返回「對象」的方法,並且可以返回多個不同類型的(主要是不同枚舉)如何使用KnownType在WCF服務合約中啓用多態返回值?

我在哪裏可以找到應對的一個例子這個?

(我使用一個包含所有類型,而不是如果有差別生成客戶端代理共享合同組件。)

回答

0

這就是我最後做的,但我很狡猾地開始使用Aaron Fischer的長期解決方案之一。

/// <summary> 
/// WCF can not cope with a method that returns an object so wrap the 
/// untyped object in a typed object. Then use KnowType to tell WCF 
/// about the typs that are wrapped 
/// </summary> 
[DataContract(), KnownType(typeof(MyType1)), KnownType(typeof(MyType2))] 
public class UntypedObjectHolder 
{ 
    [DataMember()] 
    private object m_Value; 

    public UntypedObjectHolder(object value) 
    { 
     m_Value = value; 
    } 

    public object Value 
    { 
     get { return m_Value; } 
    } 
} 

然後在我的界面

[OperationContract()] 
UntypedObjectHolder GetValue(eGetValueType valueType); 

另一種選擇可能的工作,我沒有嘗試是

[ServiceContract] 
[ServiceKnownType(typeof(PhotoCamera))] 
[ServiceKnownType(typeof(TemperatureSensor))] 
[ServiceKnownType(typeof(DeviceBase))] 
public interface IHomeService 
{  
    [OperationContract] IDevice GetInterface(); 
} 
1

那麼,documentation包含使用KnownTypeAttribute的一個例子。請注意,它允許在同一個類上有多個屬性,因此您可以識別多個多態子類型。

這是相當有限的功能,因爲它只允許您指定在設計時已知的類型,所以它並不真正適合通常使我們首先使用多態性的可擴展性和可維護性的心態。

AFAIR,這個限制的存在主要是因爲WSDL/XSD中的約束,WCF契約通常會被轉換。我們必須時刻記住,只有消息穿越導線 - 而不是對象。另一端的客戶端可能根本不是.NET應用程序,所以爲了互操作性,這些都是我們必須接受的限制。

我通常發現,更靜態的服務接口重新設計通常是更好的解決方案。你也可以考慮將返回類型公開爲System.Object,它將轉換爲xs:any,但顯然你會失去類型安全。

WCF有一個高級選項,允許您在服務器和客戶端之間共享類型,因此這也可能是您的解決方案。但是,如果您這樣做,則會失去互操作性和其他一些優點,因此在選擇它之前請仔細考慮此選項。

+0

謝謝,我在發佈問題之前閱讀文檔,但它沒有包含在方法的返回類型上使用KnowType時的示例。我只能看到在DataContracts中使用KnonType的示例 – 2009-12-01 13:59:22

+1

根據文檔,該屬性只能用於類和結構。換句話說,你不能在一個方法上使用它 - 它不會被編譯。 – 2009-12-01 14:15:54

0

我不確定KnowType attr將與枚舉一起工作,因爲它們不能被繼承?

+0

所有枚舉都從System.Enum繼承,但枚舉不能從其他枚舉繼承。 – 2010-04-27 13:34:20

1

看看這個KnownTypeProvider當我們在客戶端和服務器之間共享相同的程序集時,我們使用silverlight連接並使用NetDataContractSerializer。

+0

謝謝,你能指點我的一個例子uisng NetDataContractSerializer – 2009-12-01 15:54:55

+0

我發現http://lunaverse.wordpress.com/2007/05/09/remoting-using-wcf-and-nhibernate/ helpfull和http:/ /davybrion.com/blog/2008/01/sending-nhibernate-entities-over-the-wcf-wire/是最終讓我們工作的原因。要知道的主要是你不能使用Visual Studio自動生成的代理類與NetDataContractSerializer – 2009-12-01 16:46:51