2013-03-02 91 views
4

我使用的是VS2010和.NET 4.0。共享WCF服務和客戶端之間的接口(標有w/ServiceContract)

我已經在這裏檢查過(Sharing Interfaces that are implemented in WCF Service),但它的不同之處在於我試圖完成的操作涉及一個接口,其標記爲ServiceContract的

I.e.在服務中,我有一個接口A(標記爲ServiceContract)和一個擴展接口B(也標記爲ServiceContract)。 B由WCF服務實現。

確切擴展沿此線前進:

public interface A<T> 

public interface B : A<SpecificType> 

(「SpecificType」被標記爲DataContract)

顯然,B暴露在WCF客戶端在代理生成的處理;然而,我還需要公開接口A(我正在實現一個半通用的發佈/訂閱系統,「發佈者」需要能夠檢查/依賴接口A)。

我試圖解決這個問題的第一種方法是創建一個單獨的「共享」程序集,其中包含接口並可以被服務和客戶端使用;然而,這最終不能很好地工作,因爲在發佈者中,它需要確保B的實例實際上從A正確擴展。這種隱式轉換失敗,可能是因爲服務引用似乎並不完全與「共享」程序集合在一起。

爲了解決這個問題,我手動編輯了Re​​ference.cs文件,它結束了工作(我添加了接口A的定義並確保接口B正確地引用了它)。但是這造成了一個很大的問題,因爲每次我更新服務引用時,這些代碼都會被清除。

看了看本網站和其他人的其他WCF回覆,我似乎無法找到確切答案(也許我只是沒有完成所有答案和答案)。

如果有人能指出我正確的方向,我會很感激。

謝謝。

回答

3

爲客戶端提供對'原始'服務契約接口的訪問(彙編或鏈接到.cs文件)。然後你有兩種選擇:

1)將自動生成的代理調用包裝到你自己的類方法調用中(實現所需的接口)。服務參考更新不會傷害你。

2)不要使用自動生成的代理。創建您自己的代理(實現您的接口):

var baseAddress = "net.tcp://localhost:4503/MyService"; 
var channelFactory = new DuplexChannelFactory<IMyService>(new InstanceContext(new MyNotificationReceiver()), //MyNotificationReceiver - WCF callback implementation class 
    myNetTcpBinding, 
    new EndpointAddress(baseAddress)); 

var proxy = channelFactory.CreateChannel(); 
proxy.MyMethod(); 
+0

建議2是正確的方法。如果我控制客戶端和服務器,我從不使用服務引用/自動生成代理 – 2013-03-03 21:11:56

+0

有趣。因此,對於#2,如果我需要對服務的接口進行更改,那意味着我必須將接口的更改複製/複製到客戶端?如果是這樣,這似乎是一個很好的方式來引入潛在的錯誤/錯誤。但是,如果這是做到這一點的唯一方法,那麼如果我想完成我所追求的目標,我想我沒有多少選擇。這些是唯一的選擇嗎? (雖然,很清楚,我非常感謝關於此的討論/建議。) – BtySgtMajor 2013-03-04 03:09:02

+0

我認爲檢查/依賴服務接口/類型層次結構不是SOA的良好實踐,因爲WCF服務應該可以互操作。所以我認爲你可能需要爲你的服務引入一些特殊的「檢查/獲取/驗證目的」接口/方法。但依靠客戶端基本上是正確的。 – SalientBrain 2013-03-04 06:21:31

相關問題