2011-12-13 35 views
2

我目前正在重構由多個不同客戶端應用程序使用的一個服務合同接口(以下稱爲「SCI」)組成的大型WCF服務。我已經分解了SCI,因此對於每種類型的客戶端應用程序,都有一個特定於它所需操作的SCI。 SCI的某些共享部分在基礎SCI中定義,客戶應用程序特定的SCI繼承。爲WCF服務上可用的服務合同接口中的一個生成客戶端

有一個服務類實現所有客戶端特定的SCI。事實上,共享基地SCI存在菱形界面繼承的情況意味着,有時候,通過多個SCI可以實現相同的操作。當自動生成客戶端(尤其是使用異步客戶端方法)時,由此產生的代碼有很多醜陋的<generated-type>1,2,3等...

爲了避免這種情況,我想添加一個服務引用到每個客戶端應用程序,只有爲與該特定應用程序相關的SCI生成客戶端。這應該不會因爲不同的SCI上出現相同的功能而出現問題。

這可能嗎?

對於在這種情況下實現模塊化和代碼重用的任何其他提示也將被讚賞。

回答

1

你想要做的是創建一個服務契約接口(你可以手動執行此操作,將它從原始服務實現中拉出來或自動生成並將其複製出來)。

然後不使用服務引用,而是使用通道工廠綁定到您的服務(如下所示)。這是引用WCF服務的一種更好的方式。

您需要下列裁判要做到這一點:

using System.ServiceModel; 
using System.ServiceModel.Description; 

然後你可以使用以下命令:

 var binding = new WebHttpBinding(); 
    var factory = new ChannelFactory<IMyServiceContract>(binding, new EndpointAddress("http://url:port")); 
    factory.Endpoint.Behaviors.Add(new WebHttpBehavior()); 

    var myService = factory.CreateChannel(); 

    myService.ServiceMethod(); 
+0

所以這將意味着實現一個客戶端使用一個通道服務?是否有可能通過自動生成的異步操作來獲取自動生成的客戶端類型? – EdF 2011-12-13 23:57:52

+0

是的,你可以通過裝飾你WCF服務與ASYNC版本,請參閱此文章:http://msdn.microsoft.com/en-us/library/bb885132.aspx IE: [OperationContract(AsyncPattern = true) ] IAsyncResult BeginDivide(double n1,double n2,AsyncCallback callback,object state); double EndDivide(IAsyncResult ar); 給出了一個異步方法 – 2011-12-14 00:22:46

0

盧克的建議值得一試。 'ChannelFactory'方式與自動生成方式相比具有許多優點:您可以保留SCi的註釋,並且在SCI更改後不需要更新引用。

在生產中,您可能需要爲性能做一些Singleton chache,並將服務實現的SCI分開,因此您可以在客戶端和服務實現中引用您的SCI。

你已經提到'異步',我認爲這可能是一個綁定或行爲配置issuse。

private ChannelFactory CreateFactoryInstance<T>(string endpointConfigurationName, string endpointAddress) 
{ 
    ChannelFactory factory = null; 
    factory = new ChannelFactory<T>(endpointConfigurationName, new EndpointAddress(endpointAddress)); 
    factory.Open(); 
    return factory; 
} 
相關問題