2010-03-22 22 views
12

我有四個單獨的項目:WCF重用類型的引用程序不會重用的ServiceContract接口

  • 的MyUserControl - 需要實施IMyService

  • 爲MyService服務的引用 - 工具IMyService

  • 個MySharedInterfaces - 包含IMyUserControlIMyService

  • MyWebApp

用戶控件需要動態加載的在運行時。這實現了IMyUserControl並且具有將在運行時設置的類型IMyService的屬性。

問題是即使有重用類型的選項,MyWebApp也不會重用接口IMyService。它總是從服務參考中再次生成它。如果我可以將它轉換爲MySharedInterfaces.IMyService,這不是問題,我不明白,因爲它應該完全一樣。

用戶控件期待IMyService類型的東西。無論如何要麼WebServiceReference.IMyService回到MySharedInterface.IMyService或強制WebServiceReference重用MySharedInterface.IMyService

+0

[添加服務引用時忽略[「重用現有類型」的可能重複]](http://stackoverflow.com/questions/134064/reuse-existing-types-is-ignored-when-adding-a-service -reference) – 2010-08-16 01:41:13

+0

參見:http://stackoverflow.com/questions/3119329/wcf-service-reference-generates-its-own-contract-interface-wont-reuse-mine/17318813#17318813 – 2013-06-26 11:34:55

回答

16

馬特,你絕對可以做自己創建客戶端代理的「兩步式」過程 - 這真的不是一個大問題。

在您的客戶端應用程序中,請參考MySharedInterfaces程序集。然後,爲您服務接口創建ChannelFactory<T>的一個實例:

ChannelFactory<IMyService> factory = new ChannelFactory<IMyService>(); 

這基本上創建了一個工廠類,然後能夠建立你的客戶端和服務器之間的實際communcations通道。由於它需要服務合同,所以只有在您可以共享服務合同(您可以並且想要的情況下)的情況下,此方法纔有效。

這是一個相當耗費時間和資源的步驟,所以如果有可能的話,嘗試將工廠存放在某個地方並重用它,而不是不斷重新創建它。

鑑於你的通道工廠,你現在可以創建你的實際的溝通渠道,這基本上等同於得到由Add Service Reference生成代理客戶端:

IMyService client = factory.CreateChannel(); 

這不是一個非常昂貴的操作,所以你可以每次在撥打服務電話之前都要這樣做,不要擔心故障的通道等等。

client也實現了ICommunicationObject接口,因此,如果您需要檢查什麼WCF相關,如信道的狀態,你可以施展你的客戶:

CommunicationState currentState = ((ICommunicationObject)client).State; 

所以基本上你真的有所有的位以及您生成的客戶端代理類的部分,但您可以更好地控制您正在執行的操作。

+0

感謝代碼示例,完美地工作。 – Matt 2010-03-23 11:25:26

4

您是否在MyUserControl中包含對MySharedInterfaces的引用? MySharedInterfaces是否有任何對其他程序集的引用,這些程序集在MyUserControl中未被引用?

困難的方式是不使用生成的服務引用並使用ChannelFactory。這將始終爲您提供MySharedInterfaces的接口。

+0

感謝您的快速回復。 MyUserControl項目引用MySharedInterfaces,並且MySharedInterfaces沒有引用任何未被MyUserControl引用的引用。目前這只是一個概念證明,所以目前它非常空虛。 上週是我第一次看WCF,所以希望能夠堅持簡單的事情開始。不過,我會在ChannelFactory上閱讀。出於好奇,爲什麼它不能重用IMyServiceInterface當它可以重用其他所有東西? – Matt 2010-03-22 16:09:05

相關問題