WCF單例模式各種類型分析對(duì)比
在WCF開發(fā)工具中,有很多知識(shí)是需要我們?cè)趯W(xué)習(xí)的過程中去加強(qiáng)注意,提高認(rèn)知程度的。我們知道,WCF單例模式總共可以分為這樣兩種類型:已知單例(Well-Known Singleton)與隱式單例(Hidden Singleton)。#t#
一般地,在寄宿某個(gè)服務(wù)的時(shí)候,我們會(huì)指定服務(wù)的類型。WCF會(huì)根據(jù)服務(wù)類型,通過反射的機(jī)制,調(diào)用默認(rèn)無參構(gòu)造函數(shù)創(chuàng)建服務(wù)實(shí)例。但是,如果服務(wù)類型沒有定義無參構(gòu)造函數(shù),或者我們須要手工對(duì)服務(wù)實(shí)例作一些初始化工作,WCF提供的實(shí)例激活機(jī)制就不能為我們服務(wù)了。為了解決這種需求,須要自行創(chuàng)建服務(wù)實(shí)例,采用基于服務(wù)實(shí)例的寄宿方式來代替原來基于服務(wù)類型的寄宿方式。只有WCF單例模式實(shí)例上下文模式才能采用這種寄宿方式,我們把這種基于現(xiàn)有服務(wù)對(duì)象的服務(wù)實(shí)例提供模式稱為“已知單例(Well-Konown Singletone)模式”??梢岳肧erviceHost下面一個(gè)構(gòu)造函數(shù)重載來實(shí)現(xiàn)基于已知單例的服務(wù)寄宿。
- public class ServiceHost : ServiceHostBase{
//其他成員- public ServiceHost(object singletonInstance,
params Uri[] baseAddresses); }- CalculatorService calculatorService = new CalculatorService();
- using (ServiceHost host = new ServiceHost(calculatorService,
new Uri("http://127.0.0.1:9999/calculatorservice")))- {
- host.Open();
- Console.Read();
- }
通過上述方法設(shè)置已知的WCF單例模式服務(wù)對(duì)象,可以通過 ServiceHost的只讀屬性SingletonInstance獲得。而對(duì)于服務(wù)的ServiceHost的獲取,可以通過當(dāng)前OperationContext的只讀屬性Host得到。(通過OperationContext的Host只讀屬性獲得的是ServiceHostBase對(duì)象,如果沒有使用到自定義的ServiceHostBase,通過該屬性獲得的是ServiceHost對(duì)象)。下面的代理列出了相關(guān)的API和編程方式:
- public class ServiceHost : ServiceHostBase
- {
- //其他成員
- public object SingletonInstance { get; }
- }
- public sealed class OperationContext : IExtensibleObject
<OperationContext>- {
- //其他成員
- public static OperationContext Current { get; set; }
- public ServiceHostBase Host { get; }
- }
- ServiceHost host = OperationContext.Current.Host as ServiceHost;
- if (host != null)
- {
- CalculatorService singletonService = host.SingletonInstance
as CalculatorService;- }
對(duì)于WCF單例模式實(shí)例上下文模式,如果采用傳統(tǒng)的基于服務(wù)類型的寄宿方式,即通過服務(wù)類型而非服務(wù)實(shí)例創(chuàng)建ServiceHost對(duì)象,服務(wù)實(shí)例是通過WCF內(nèi)部的服務(wù)實(shí)例激活機(jī)制創(chuàng)建的。不同于其他兩種實(shí)例上下文模式采用請(qǐng)求式實(shí)例激活方式(單調(diào)實(shí)例上下文在處理每次調(diào)用請(qǐng)求時(shí)創(chuàng)建,而會(huì)話實(shí)例上下文模式則在接收到某個(gè)客戶端的第一次調(diào)用請(qǐng)求時(shí)創(chuàng)建服務(wù)實(shí)例上下文),單例實(shí)例上下文在ServiceHost的初始化過程中被創(chuàng)建。我們把這種模式稱為隱式單例模式。
我們談到整個(gè)服務(wù)的寄宿過程大體分為兩個(gè)階段:ServiceHost的初始化和ServiceHost的開啟。第一個(gè)階段的主要目的在于通過對(duì)服務(wù)類型的反射,以及對(duì)配置的解析,創(chuàng)建用于表示當(dāng)前寄宿服務(wù)的ServiceDescription對(duì)象,而隱式單例服務(wù)對(duì)象就創(chuàng)建于這個(gè)階段。
當(dāng)基于單例服務(wù)的ServiceHost被成功創(chuàng)建并被初始化后,服務(wù)描述(通過類型System.ServiceModel.Description.ServiceDescription表述)被創(chuàng)建出來。閱讀了第7章的讀者應(yīng)該很清楚,ServiceDescription有一個(gè)Behaviors屬性維護(hù)著服務(wù)所有服務(wù)行為。通過自定義特性設(shè)置的ServiceBehaviorAttribute作為最常見的一種服務(wù)的行為自然也在其中。在服務(wù)寄宿過程中指定的已知服務(wù)實(shí)例,和WCF創(chuàng)建的隱式服務(wù)實(shí)例則分別保存在ServiceBehaviorAttribute的兩個(gè)私有變量之中。
- 1: public class ServiceDescription
- 2: {
- 3: //其他成員
- 4: public KeyedByTypeCollection<IServiceBehavior>
Behaviors { get; }- 5: }
- 1: [AttributeUsage(AttributeTargets.Class)]
- 2: public sealed class ServiceBehaviorAttribute : Attribute,
IServiceBehavior- 3: {
- 4: //其他成員
- 5: private object hiddenSingleton;
- 6: private object wellKnownSingleton;
- 7: }
以上就是我們?yōu)榇蠹医榻B的WCF單例模式相關(guān)內(nèi)容。