2011-10-18 56 views
3

揭開序幕我的WCF服務,我使用以下命令:自主機WCF的ServiceHost對象的生命週期

selfHost = new ServiceHost(typeof(MyServiceClass)); 
selfHost.Open(); 

在某些時候,這將創建的MyServiceClass一個實例。它會爲每個請求創建一個實例還是一個實例?

回答

4

如果你想將其限制在一個單一的情況下,你可以在外面實例化服務類和實例的通入的ServiceHost:

var myservice = new MyServiceClass(); 
selfHost = new ServiceHost(typeof(MyServiceClass), myservice); // forces singleton pattern 
selfHost.Open(); 
+0

注意實施,這將需要改變'MyServiceClass'添加'[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]'。 InstanceContextMode在另一個答案中提到。 –

+1

@DeniseSkidmore此外,如果InstanceContextMode.Single被設置爲比沒有真的需要創建作爲答案描述的服務主機,可以一樣好使用的ServiceHost,它僅使用了創建的類型構造 – Ghita

4

默認情況下,它的每個請求的實例,但你可以改變這一點。例如,您可以編寫自己的IInstanceProvider並自行管理服務類的生命週期。

+0

加以改變? – spender

+0

@spender,是的,它可以。你可以寫一個自定義的'IInstanceProvider'。例如,當你想在服務類中注入一些依賴關係時,這通常用於DI框架。 –

0

它將每個請求創建實例。如果你想要一個實例,你可以使用一個靜態類。靜態類存在於應用程序的整個生命週期中。每次有呼叫或新的WCF連接時,他們都不會重新實例化。

+0

靜態服務類是壞理念。你的靜態類如何實現ServiceContract接口? – ErnieL

+0

這是真的,也許我應該更具體,靜態類優勢可能只用於服務器端。 – neurotix

4

所有這些問題的答案是正確的,但他們似乎比你所要求的更爲複雜。它是否創建每次通話的情況下,每個會話,或單基本由InstanceContextMode這是您的服務類中的屬性控制。開始閱讀。