http://china.udotnet.com/cnudotnet_num_416.aspx
新事務之一: dotNET和COM+中的事務(1)
新事務之一: dotNET和COM+中的事務
--------------------------------------------------------------------------------
小氣的神
2002-4-16
Article Type: In-Depth
難度等級:6/9
版本:2.32
COM+早於dotNET出現,並且在這幾年成為我們在Windows平台下進行分布式和企業級開發的一個解決方案和操作平台,它預置了一些面向企業級應用的通用和底層設施,特別是多層應用程式模型的中介層的基礎設施模組,藉助它可以使得開發人員有更多的精力放在應用的商務邏輯本身,有趣的是有時它並不真的讓我們滿意,值得一提的是從它的父輩開始,都一直是作業系統的一部分。dotNET則是Microsoft最近發表的下一代的一個面向Web的開發平台,比起它所有的前任都顯得野心勃勃和氣勢龐大,所以說足夠瘋狂和讓人振奮。對於dotNET來說COM+是一個成熟而意義重大的曆史夥伴,而對於COM+來說dotNET是一個新鮮而略帶侵略性的新貴朋友,無論兩者如何,對於相對局外的開發人員來說,如何和它們相處和互動將成為一個不小的瓶頸,有些糟糕的是dotNET和COM+在我們之外,而且在不斷髮展和變化。所以一定有一些有趣的事情,而我們把範圍縮小,聚焦在我們開發過程中可能密切相關的事務編程上,可以說,變化帶來了許多新的變化而且也帶來了許多開發人員的新的思考,在後面的文章中你們會陸續看到他們的思考給我帶來的啟發和益處,那麼希望同樣也能給更多的人帶來啟發和思考。
消除一些模糊的概念
一段時間以來我們對dotNET、CLR、COM、COM+存在一些模糊不清的概念,dotNET是Microsoft定義的下一代的開發平台。CLR(Common Language Runtime)是dotNET的核心和心臟,也是Microsoft對ECMA規範的一個Windows平台的實現。COM(Component Object Model)是一個元件物件模型,提供了組件之間互動和作用的基本機制和原則,它是一項組件開發技術和編程模型。COM+是一個組件運行環境,是提供了一系列有關分布式系統功能的Services集合的組件運行環境和工具包。CLR替代了COM,但是無法也沒有替代COM+,COM+現在叫.NET Enterprise Services,當然如果不帶.NET的首碼,Enterprise Services最能體現COM+的作用和定義。CLR離應用程式層近一些,而COM+離作業系統更近一些,對於最近的Windows.NET的作業系統對COM+進行的一系列增強:Application Partitioning、Application Pooling and Recycling、Resource Manager、Configurable Transaction Isolation Level、Web Services等等(詳見Juval Lowy的文章)來說,有些低級的程式API,CLR還根本無法有相應的功能提供,還需要wrapping 這些新的COM+ APIs。當然不能肯定未來的未來,這些COM+的API是用C#或其它的CLR-managed API直接實現。目前可以說,如果以前你用COM技術在COM+環境下工作的很好(或者很痛苦),那麼現在用CLR在COM+下工作起來一樣也很好,並且要方便,快捷;dotNET使得開發人員使用COM+更加方便和有效率,這就如同許多年以前從字元鍵盤介面(COM)引入圖形滑鼠介面(dotNET)是對電腦的使用(COM+)的一場革命一樣。
dotNET中使用COM+的事務服務
dotNET環境下使用COM+以及事務服務要經過下面一些步驟:
1. 實現一個COM+的Configured類
我們只用從System.EnterpriseServices.ServicedComponent繼承一個自己的類,然後提供一個預設的建構函式
2. 聲明分散式交易
只用這類名前面加事務屬性即可比如:[Transaction(TransactionOption.Required) ]
3. 提交事務
IObjectControl::SetComplete或是直接使用自動完成屬性 [AutoComplete()]
4. 其它的IObjectConstruct、IObjectControl、Pooling、JustInTimeActivation
A) IObjectConstruct :類名前加[ConstructionEnabled(Default="Connection String")]屬性,然後覆蓋方法 public override void Construct(string constructString){}
B) Pooling:類名前加屬性[ ObjectPooling(true, 3,30) ],然後覆蓋CanBePooled方法,public override bool CanBePooled() { return true; }
C) JustInTimeActivation :加屬性[ JustInTimeActivation(true) ]
5. 編譯和分發
a) 組件註冊
[assembly: ApplicationName("MydotNetCOMApp")]
[assembly: ApplicationActivation(ActivationOption.Library)]
b) 組件強名
[assembly: AssemblyKeyFile("keyfile.snk")]
這一步如果先產生sn.exe 產生.snk檔案然後在VS.NET IDE中開啟AssemblyInfo.cs,加入上面的一行似乎更方便這樣就不用手工的csc編譯了,VS.NET可以編譯強名的Assembly。嘗試使用AssemblyInfo.cs會更規範和統一。
c) 編譯組件
sn -k keyfile.snk
csc /out: dbClass.dll /t:library /r:System.EnterpriseServices.dll dbClass.cs
d) 發布登記
Regsvcs dbClass.dll (Regsvcs自動調用regasm.exe和tlbexp.exe)
一個大致的檔案可能向下面這樣,先原諒我展示了太多的屬性:)
using System;
using System.EnterpriseServices; // Namespace necessary for creating COM+ application
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
[assembly: ApplicationName("COMPlusSamplesLib")]
[assembly: ApplicationActivation(ActivationOption.Library)]
//[assembly: AssemblyKeyFile("..//..//keyfile.snk")]
namespace dotCNetwork.dbClass
{
/// <summary>
/// Summary description for Class1.
/// </summary>
[ConstructionEnabled(Default="server=localhost;uid=sa;pwd=;initial catalog=pubs")]
//[ EventTrackingEnabled ]
[ObjectPooling(MinPoolSize=2,MaxPoolSize=50)]
[ Transaction(TransactionOption.Required) ]
[ Synchronization(SynchronizationOption.Required) ]
[ JustInTimeActivation(true) ]
[Guid("569A14C1-5DAD-4c8f-BB48-89DDD89FAD7A")]
public class Author : ServicedComponent
{
private const string CONNSTRING="server=localhost;uid=sa;pwd=;initial catalog=pub";
private string ConnString ;
public Author()
{
//
// TODO: Add constructor logic here
//
}
//JIT/Pooling
protected override void Activate()
{}
// JIT/Pooling
protected override void Deactivate()
{}
//JIT/Pooling
protected override bool CanBePooled()
{ return true ; }
//Construct String
protected override void Construct( string s )
{
if( s.Length== 0 || s == null)
{
ConnString = CONNSTRING;
}
ConnString = s ;
}
//my Function
public bool alive()
{
try
{
// Commit the transaction
ContextUtil.SetComplete();
return true ;
}
catch(Exception e)
{
ContextUtil.SetAbort();
return false ;
}
}
[AutoComplete]
public string GetConnectionStr()
{
return ConnString;
}
}
}
關於如何產生一個dotNET的組件並且註冊到COM+環境中以及用戶端如何調用的具體步驟和執行個體我就跳過了,請參照Microsoft的標準規範和建議。
(未完)
--------------------------------------------------------------------------------
特別:
本文CSDN署名首發,轉載或改編請註明作者和出處。如果有問題,請發電子郵件給new2001@msn.com
以上文字和圖片涉及其他人的隱私和個人權利,所有文字和圖片只用於內部交流,不作任何新聞發表和商業用途。
--------------------------------------------------------------------------------
Copyright ?2005 china.udotnet.COM