2009-01-31 50 views
2

在Visual Studio中向Web服務(這是全部WCF)添加服務引用會生成一些生成的代碼,包括正在公開的接口的客戶端重新聲明。Web服務和接口兼容性

我明白爲什麼會生成此接口:您可能正在使用第三方服務並且無法訪問實際接口。

但是我這樣做,並且兩個是而不是賦值兼容即使透明代理確實實現了我想要投射的接口。

我可以使用反射,但這是醜陋的。有什麼方法可以打敗這種人造類型的安全並注入元數據,以便我可以使用一個類與接口?


我的具體問題,從具有與直接使用基類的一些衍生品,並通過服務引用遠程使用別人的單一客戶做複雜的方式規範出發。每個服務器的基類需要保持對集合中的訂閱客戶端的引用,以便枚舉通知事件,並且由於使用代理服務器,問題類型不同。

這些答案都不能解決我的具體問題,但每一個答案都是有益的和有益的。我找到了自己的解決方案(使用雙重綁定),但如果您沒有從根本上改進我對整個業務的理解,我永遠都不會想到它。

三個很好的答案。如何選擇一個?我選擇第一個,因爲它直接解決了我的第一個問題我以爲

回答

2

添加服務引用時,請轉到「高級」,並確保選中「在引用的程序集中重用類型」,並選擇包含您的接口定義的程序集。您也可以通過右鍵點擊它並轉到「配置」來使用現有的服務參考。

+0

一會兒那裏,我還以爲你知道答案,但是這已經被選中。 – 2009-01-31 10:28:46

4

如果你已經在客戶端有合同DLL,你甚至不需要服務引用(除非你使用它來爲你編寫設置代碼) - 你可以簡單的子類化ClientBase並展示Channel,使用直接 - 像(沒有IDE方便...):

public class WcfClient<T> : ClientBase<T> where T : class 
{ 
    public new T Channel {get {return base.Channel;}} 
} 

然後,你可以做這樣的事情:

using(var client = new WcfClient<IFoo>()) 
{ 
    client.Channel.Bar(); // defined by IFoo 
} 

你仍然需要在配置的配置設置來確定地址,綁定等 - 但不如代理生成混亂。此外,您還可以選擇重新實現IDipsoable處理的事實,WCF代理可以在Dispose()拋出(這是壞的):

public class WcfClient<T> : ClientBase<T>, IDisposable where T : class 
{ 
    public new T Channel {get {return base.Channel;}} 
    void IDisposable.Dispose() { 
     try { 
      switch(State) { 
       case CommunicationState.Open: Close(); break; 
       // etc 
      } 
     } catch {} // swallow it down (perhaps log it first) 
    } 
} 
+0

非常時髦。我會在某個時候使用它,我確信它。如果只是爲了證明我(借來的)冷靜。 – 2009-01-31 14:00:10