.Net服務組件(ServicedComponent)簡介及其使用

.NET Enterprise Services 爲企業應用程序提供重要的基礎結構。COM+ 爲企業環境中部署的組件編程模型提供服務結構。System.EnterpriseServices命名空間向 .NET 對象提供對 COM+ 服務的訪問,COM+ 服務令 .NET Framework 對象更適用於企業應用程序。html

服務組件(ServicedComponent)是一種使 COM+ 服務可以用於 .NET Framework的機制。實時 (JIT) 激活、同步、對象池、事務和共享的屬性管理都是可使用的熟知的 COM+ 服務。還有其餘 COM+ 服務,如鬆耦合事件、排隊組件 (QC) 和基於角色的安全性,可使用這些服務來編寫靈活的、基於 .Net Framework的應用程序。算法

 

1. 可用的COM+服務列表數據庫

(1)自動事務處理(Automatic transactions): COM+ 提供的一個服務,用於在設計時配置類,以便在運行時參與事務。COM+ 使您可以爲要求事務處理的每個類指定不一樣的事務超時。可使用這一功能解決衝突的超時狀況,如強制短期事務和容許長時間運行的批存儲過程。編程

若是不指定事務超時值,則使用計算機整個系統範圍的超時值。事務超時是以秒爲單位度量的整數值。下面的示例說明如何將事務超時設置爲 10 秒。緩存

[Transaction(TransactionOption.Required, Isolation=TransactionIsolationLevel.Serializable, Timeout=10)]安全

 

[ AutoComplete(true/false) ]屬性應用於方法,若是方法標明[ AutoComplete(true) ],指定若是事務成功完成應用程序應自動調用ContextUtil.SetComplete()方法,若是異常,則調用ContextUtil.SetAbort()方法。服務器

若是方法標明[ AutoComplete(false) ]或者忽略這一屬性(AutoComplete配置前的默認值爲false),則須要在程序中手動管理事務,經過調用ContextUtil類的靜態方法SetComplete()和SetAbort()來完成。多線程

 

(2)COM+ BYOT(帶來您本身的事務) 功能容許 COM+ 組件將先前存在的 Microsoft 分佈式事務處理協調器 (DTC) 或事務 Internet 協議 (TIP) 事務設置爲新組件的上下文的事務屬性。此功能容許將 COM+ 組件與生存期受事務處理監視器、對象事務服務或數據庫管理系統控制的事務關聯。BYOT 對於集成由 TIP 協調的事務也有用處。併發

注意:對於編寫業務組件來講,首選的編程模型是自動事務,而不是 BYOT 事務。使用 BYOT 事務時必須謹慎。app

 

(3)補償資源管理器 (CRM) 是 COM+ 提供的一項服務,使您能夠在 Microsoft 分佈式事務處理協調器 (DTC) 事務中包括非事務性對象。雖然 CRM 不提供完整資源管理器的功能,但它們卻經過恢復日誌提供事務性原子性(全有或全無行爲)和持久性。

 

(4)Just-in-time (JIT) activation: COM+ 實時 (JIT) 激活服務容許更好地使用空閒服務器資源。將組件配置爲 JIT 激活後,COM+ 可在客戶端仍保持對象的當前引用時停用該組件的實例。客戶端下次在該對象上調用方法時,COM+ 將「實時地」以對客戶端透明的方式從新激活該對象。

注意   對於配置爲 JIT 激活的組件,對象首次建立時被激活。

 

在方法調用返回時,COM+ 停用該對象,但將上下文留在內存中。已停用的對象釋放全部資源,包括鎖定昂貴的數據存儲區。

 

若要啓用 JIT 激活,請將 JustInTimeActivationAttribute 屬性應用於從 System.EnterpriseServices.ServicedComponent 派生的類。另外,爲確保在方法調用返回時停用對象,有必要設置對象的完成位。對於事務性組件,可將 AutoCompleteAttribute 應用於類或者調用 ContextUtil.SetComplete 或 ContextUtil.SetAbort。對於非事務性組件,則調用 ContextUtil.DeactivateOnReturn。

注意   自動事務處理要求 JIT 激活;所以,爲自動事務處理配置類時,隱式啓用 JIT 激活。

 

(5)Loosely coupled events:COM+ 提供的鬆耦合事件模型支持後期綁定事件或發佈服務器和訂閱服務器之間的方法調用,同時還支持事件系統。不用反覆地輪詢服務器,事件系統會在信息可用時通知有關各方。

 

若要使用此服務,事件類和事件接收必須直接或間接從 System.EnterpriseServices.ServicedComponent 類派生。

 

(6)對象構造(Object construction):COM+ 對象構造用於從外部指定初始化信息,從而沒必要在類內指定硬編碼配置信息。與對象池一塊兒使用的對象構造函數提供資源分配器的能力,而沒必要實現完整的資源分配器。

 

能夠這樣配置對象構造,即,將 ConstructionEnabledAttribute 屬性應用到從 System.EnterpriseServices.ServicedComponent 類派生出來的類。

 

(7)對象池(Object pooling):COM+ 對象池服務能夠減小從頭建立每一個對象的系統開銷。在激活對象時,它從池中提取。在停用對象時,它放回池中,等待下一個請求。

對象池使您可以控制所使用的鏈接數量,與鏈接池相反,鏈接池用來控制達到的最大數量。下面是對象池和鏈接池之間的重要區別:

  • 建立。使用鏈接池時,建立在同一線程上進行,所以若是池中沒有鏈接,則表明您建立鏈接。採用對象池時,池能夠決定建立新對象。可是,若是已經達到最大數量,它會給您下一個可用的對象。當須要花費較長時間來建立對象時,這的確是一個重要的行爲。但不要長期使用這種方法來建立對象。
  • 最小值和最大值的實施。不在鏈接池中實施。對象池的最大值在嘗試縮放應用程序時很重要。可能須要僅爲幾個對象而複用成千上萬個請求。

[ObjectPooling(Enabled=true, MinPoolSize=2, MaxPoolSize=5, CreationTimeOut=20000)]

 

(8)專用組件[PrivateComponent]:公用組件能夠從其餘應用程序中激活,但您可能在應用程序中有多個幫助器組件,這些組件只能從該應用程序內的其餘組件調用。在 COM+ 中,可使用 PrivateComponentAttribute 屬性將這些組件標記爲專用。專用組件只能由同一應用程序中的其餘組件看到和激活。若是調用專用組件的任何類,從進程外調用就會失敗,而從進程內調用就會成功。相比之下,若是調用公用組件上的任何類,進程內和進程外調用都會成功。

 

(9)排隊組件(Queued components):COM+ 排隊組件服務提供了一種使用 Microsoft 消息隊列異步調用和執行組件的便捷方式。無論發送方或接收方的可用性或可訪問性如何,均可進行處理。

[ApplicationQueuingAttribute(QueueListenerEnabled = true, MaxListenerThreads =  64 )]

MaxListenerThreads 屬性指示併發排隊組件偵聽器線程的最大數。此值的有效範圍是 0 到 1000。對於新建立的應用程序,設置是從當前用於肯定偵聽器線程的默認數量的算法獲得的:16 乘以服務器中的 CPU 數量。此值並不代表任什麼時候候正在運行的線程數量,只是可能的線程的最大數量。在空閒服務器上,可能只有一個線程在運行,直到在隊列中出現更多消息爲止。而後服務器將按須要建立更多線程,直到它達到 MaxListenerThreads 值。上面的示例將排隊組件偵聽器線程的最大數量設置爲 64。

 

(10)基於角色的安全性(Role-based security):NET Framework 提供了將託管代碼與 COM+ 安全服務集成的機制。此功能依靠與執行代碼關聯的 Microsoft Windows NT標記做爲標識的基礎。

注意   .NET Framework 和 COM+ 基於角色的安全性機制是相互獨立的,在單個應用程序內只能使用一個機制。

COM+ 安全依靠 Windows NT 賬戶和進程/線程模擬。若是託管代碼提供身份驗證服務,那麼在調用任何 COM 對象以前,它必須得到 Windows NT 安全標記並進行模擬。

 

(11)SOAP 服務 (Only in COM+ 1.5):COM+ SOAP 服務容許採用現有的組件做爲 XML Web services 發佈。客戶端仍能夠繼續使用之前的方法訪問該組件,但該組件也可使用 WSDL(Web 服務描述語言)和 SOAP 進行訪問。

[ApplicationActivation(ActivationOption.Library, SoapVRoot="MyVRoot")]

SoapVRoot 屬性用於託管代碼時,它使您可以經過 COM+ SOAP 服務公開託管服務組件。配置此屬性等效於在包含服務組件的 COM+ 應用程序上啓用 SOAP 服務。SoapVRoot 屬性包含要做爲終結點發布的虛擬根目錄的名稱。名稱是一個簡單的字符串(例如,「MyVRoot」),能夠在 Web 服務器上做爲「http://MyServer/MyVRoot」發佈。若是不提供值,SoapVRoot 屬性將設置爲空。

 

(12)同步[Synchronization]:同步是執行的邏輯線程,有時稱爲「活動」。COM+ 同步服務提供在對象之間流動的同步,並在任何給定時間都禁止一個以上的調用方進入組件。同步肯定什麼時候線程能夠調度對對象的調用。

若要使用自動同步,請將 SynchronizationAttribute 屬性應用到從 System.EnterpriseServices.ServicedComponent 派生的類。

 

******

雖然COM+提供了一大堆Attribute,實際上平時比較經常使用的Attribute有:Automatic transactions, Object Pooling和Just-in-Time activation。

 

2. COM+ 應用程序標識

能夠經過名稱或 GUID 標識現有的 COM+ 目標應用程序。.NET 服務安裝工具 (Regsvcs.exe) 提供 /appname: 選項,用於指定應用程序名。

[ assembly: ApplicationName("BankComponent")]

 

若是將 ApplicationID 屬性(或 Guid 屬性)應用到程序集,以下面的示例所示,則全部針對應用程序的搜索都基於該 GUID,而不基於應用程序名。

[ assembly: ApplicationName("BankComponent")]

[ assembly: ApplicationID("4fb2d46f-efc8-4643-bcd0-6e5bfa6a174c")]

 

3. 激活類型

激活類型肯定服務組件是在調用方的進程(庫)中仍是在新進程(服務器)中建立的。能夠應用 ApplicationActivationAttribute 屬性來指定激活類型。

注意   若是 ApplicationActivationAttribute 屬性設置爲 Server - [ assembly: ApplicationActivation(ActivationOption.Server)],則在可使用服務器應用程序以前,必須用 Windows 安裝程序將程序集及其所依賴的全部程序集添加到全局程序集緩存 (GAC) 中;不然,應用程序將產生異常。此外,若是 ApplicationActivationAttribute 屬性設置爲 Server,則服務組件的任何參數都必須標記爲 Serializable,或者必須從 MarshalByRefObject 類派生。不然,應用程序將產生異常。

默認設置爲:[ assembly: ApplicationActivation(ActivationOption.Library)]

 

 

4. 註冊服務組件

服務組件由 COM+ 應用程序承載,且必須對該應用程序是可訪問的。爲了便於訪問,服務組件有下面的註冊和配置要求:

  • 程序集必須具備強名稱。
  • 程序集必須在 Windows 註冊表中註冊。
  • 類型庫定義必須註冊並安裝到特定的 COM+ 應用程序中。
  • 以編程方式添加的服務必須在 COM+ 目錄中配置。

 

動態註冊程序集

部署服務組件的應用程序的最簡單方式是採用動態註冊,它包括將包含一個或多個服務組件的程序集複製到 COM+ 應用程序的目錄中。動態註冊的程序集不放在全局程序集緩存中。

注意   放在全局程序集緩存中的程序集要求手動註冊。

 

若是建立了服務器應用程序,則在該應用程序可使用以前,必須用 Windows 安裝程序將程序集及其依賴的全部程序集添加到全局程序集緩存 (GAC) 中;不然,該應用程序將生成異常。

 

手動註冊程序集

.NET Framework SDK 提供 .NET 服務安裝工具 (Regsvcs.exe),用於手動註冊包含服務組件的程序集。Regsvcs.exe 是一個命令行工具。還能夠經過建立 RegistrationHelper 類的實例並使用 InstallAssembly 方法,利用 System.EnterpriseServices.RegistrationHelper 類以編程方式訪問這些註冊功能。

雖然並非總這樣要求,但手動註冊程序集對於設計時測試是有幫助的。與動態註冊不一樣,手動過程能提供有關在執行時遇到的錯誤的反饋。

 

5. .Net環境下建立COM+服務組件

能夠參考CodeProject.com網站Giles的這篇文章《Creating COM+ Objects using EnterpriseServices in .Net》,在CodeProject.com上評論不錯。

 

關於.Net環境下建立COM+服務組件的例子,大部分都是演示關於多數據庫更新的分佈式事務控制。實際上,若是採用SQL Server做爲Database Server,不論是跨Database,仍是跨SQL Server,均可以經過Stored Procedure中的事務控制,或者是ADO.Net的SqlTransaction對象來實現,只是不推薦這樣作而已。

 

******

上述關於COM+/服務組件介紹部分的大量內容來自MSDN Reference 1。

 

References:

1, MSDN, http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconservicedcomponentoverview.asp

2, Giles, Creating COM+ Objects using EnterpriseServices in .Net, http://www.codeproject.com/csharp/estransactions.asp

相關文章
相關標籤/搜索