WCF單例模式各種類型分析對比
在WCF開發工具中,有很多知識是需要我們在學習的過程中去加強注意,提高認知程度的。我們知道,WCF單例模式總共可以分為這樣兩種類型:已知單例(Well-Known Singleton)與隱式單例(Hidden Singleton)。#t#
一般地,在寄宿某個服務的時候,我們會指定服務的類型。WCF會根據服務類型,通過反射的機制,調用默認無參構造函數創建服務實例。但是,如果服務類型沒有定義無參構造函數,或者我們須要手工對服務實例作一些初始化工作,WCF提供的實例激活機制就不能為我們服務了。為了解決這種需求,須要自行創建服務實例,采用基于服務實例的寄宿方式來代替原來基于服務類型的寄宿方式。只有WCF單例模式實例上下文模式才能采用這種寄宿方式,我們把這種基于現有服務對象的服務實例提供模式稱為“已知單例(Well-Konown Singletone)模式”。可以利用ServiceHost下面一個構造函數重載來實現基于已知單例的服務寄宿。
- 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();
- }
通過上述方法設置已知的WCF單例模式服務對象,可以通過 ServiceHost的只讀屬性SingletonInstance獲得。而對于服務的ServiceHost的獲取,可以通過當前OperationContext的只讀屬性Host得到。(通過OperationContext的Host只讀屬性獲得的是ServiceHostBase對象,如果沒有使用到自定義的ServiceHostBase,通過該屬性獲得的是ServiceHost對象)。下面的代理列出了相關的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;- }
對于WCF單例模式實例上下文模式,如果采用傳統的基于服務類型的寄宿方式,即通過服務類型而非服務實例創建ServiceHost對象,服務實例是通過WCF內部的服務實例激活機制創建的。不同于其他兩種實例上下文模式采用請求式實例激活方式(單調實例上下文在處理每次調用請求時創建,而會話實例上下文模式則在接收到某個客戶端的第一次調用請求時創建服務實例上下文),單例實例上下文在ServiceHost的初始化過程中被創建。我們把這種模式稱為隱式單例模式。
我們談到整個服務的寄宿過程大體分為兩個階段:ServiceHost的初始化和ServiceHost的開啟。第一個階段的主要目的在于通過對服務類型的反射,以及對配置的解析,創建用于表示當前寄宿服務的ServiceDescription對象,而隱式單例服務對象就創建于這個階段。
當基于單例服務的ServiceHost被成功創建并被初始化后,服務描述(通過類型System.ServiceModel.Description.ServiceDescription表述)被創建出來。閱讀了第7章的讀者應該很清楚,ServiceDescription有一個Behaviors屬性維護著服務所有服務行為。通過自定義特性設置的ServiceBehaviorAttribute作為最常見的一種服務的行為自然也在其中。在服務寄宿過程中指定的已知服務實例,和WCF創建的隱式服務實例則分別保存在ServiceBehaviorAttribute的兩個私有變量之中。
- 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: }
以上就是我們為大家介紹的WCF單例模式相關內容。