dotNET和COM+中的事務1

來源:互聯網
上載者:User

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 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.