c#繼承com

iDotNetSpace發表於2009-10-28
大概看了一下書,照做了一下,感覺功能上主要就是能實現一個事務的功能,其他的沒有看到什麼新鮮的東東。還有就是這個也能實現remoting那種功能, 可以計算機間通訊,不過書裡講的也不深,自己又懶得找資料看了,大概也就是明白了一個基本的實現和使用吧。對com+元件的設定可以在程式裡用屬性設定, 也可以在com+元件服務瀏覽器裡進行設定。下面是有元件和無元件的程式碼

有元件:
using System;
using System.Collections.Generic;
using System.Text;
using System.EnterpriseServices;
using System.IO;
using MySql.Da
ta.MySqlClient;
using MySql.Data;


//在這裡進行的配置,都可以在管理工具中的元件服務中進行相應的配置,服務元件使用regsvcs dllname.dll的方式來部署
//要呼叫這種有元件的服務,呼叫程式需要引用System.EnterpriseServices和這個元件的dll

[assembly:ApplicationName("EnterpriseServiceTest")]//在componentservice瀏覽器中顯示的應用程式的名字
[assembly:Description("An EnterpriseService Test")]//關於這個程式的描述文字,將顯示在componentservice瀏覽器中的com+應用程式屬性中

//指定此程式是執行在客戶機(呼叫方)的程式中(ActivationOption.Library)還是執行在一個單獨的程式中(ActivationOption.Server)
//如果使用ActivationOption.Library則在使用componetservice瀏覽器建立安裝包的時候,就不能使用application proxy選項
//這個選項也可以在註冊後,在元件服務中設定和修改。如果使用ActivationOption.Server,則可以在元件服務中匯出時,生成代理MSI安裝檔案,然後在客戶機中
//執行對代理的安裝,並在客戶機上的客戶端應用程式引用安裝的DLL檔案,實現類似remoting效果的遠端通訊,也可以只生成類庫的msi安裝檔案,直接在其他計算機中
//安裝,並在客戶應用程式中引用安裝的DLL即可直接在本機使用元件的功能
[assembly:ApplicationActivation(ActivationOption.Library)]
[assembly:ApplicationAccessControl(false)]//定義程式的安全配置,bool值表示是否啟用訪問控制
namespace EnterpriseServiceTest
{
public interface IEnterpriseServiceTest
{
string ProceedStr(string str);

}

[EventTrackingEnabled(true)]//標誌是否能用componentservice瀏覽器來監視這個對像,預設是false,因為允許監視會降底程式效能
[Description("A TestComponet")]//瀏覽器中元件屬性中顯示的描述文字

//如果指定了 JIT 啟用,則不能在 COM+ 目錄中禁用該啟用功能,反之亦然。如果在 COM+ 目錄中啟用了該啟用功能,則必須在元件中指定該功能。
//對於在 COM+ 中配置的元件,JIT 啟用預設為關閉;但如果請求自動事務,則自動啟用 JIT 啟用。
//使用類在例項化的時候不啟用,而是在呼叫第一個方法時啟用
[JustInTimeActivation(false)]

[ObjectPooling(1,10)]//如果元件初始化需要時間較長,則可以用此屬性配置對像池,設定對像池的最小和最大對像數
//Required如果已經執行在一個事務中就使用當前的事務,如果沒有事務,則建立一個新的
//RequiresNew不管是否已經執行在一個事務中,都建立一個新的事務,並執行於其中
//Supported如果執行在一個事務中就使用當前的事務,如果沒有事務,則不會建立新事務
//NotSupported即使存在一個事務,也不會執行在這個事務當中
//Disabled忽略當前環境中的任何事物處理
[Transaction(TransactionOption.Required)]
//ConstructionEnabled第二個引數的值會顯示在componentservice瀏覽器中的Activation設定中,先可以通過那裡來修改這個值,最終這個值可以通過
//ServicedComponent類中的Construct方法得到
[ConstructionEnabled(true, Default = "Database=Test;Data Source=192.168.1.3;Port=3306;User Id=root;Password=1980425")]
//ServicedComponent是所有服務元件類的基類,為啟用和構造提供了一些方法。
//啟動了使用繼承了ServiceComponet類的類的程式,都會自動啟動配置com+應用程式,但啟動程式必須有相應的許可權才能進行配置。
//手式配置則使用.net提供的regsvcs assemblyname(xxx.dll),配置好後可以在管理工具中的元件服務中com+應用程式中來驗證配置是否成功
//此程式集的生成要使用強名稱來升成,否則在進行上面的安裝配置的時候會失敗,另外.net的類庫建立的時候預設的是ComVisible是false
//要在AssemblyInfo.cs檔案中,將這個屬性更改成true才可以成功安裝
public class TestComponent:ServicedComponent,IEnterpriseServiceTest
{

private string connStr = "";

protected override void Construct(string s)
{
this.connStr = s;
}

#region IEnterpriseServiceTest 成員

//這個屬性表明自動處理事務,如果成功,則自動呼叫 ContextUtil.SetComplete來完成事務,
//如果事務過程當中發生了問題丟擲異常,則自動呼叫ContextUtil.SetAbort來中止事務處理,
//如果不使用這個屬性則需要自己在程式中手動呼叫它們來完成或中止事務
//支援事務的方法執行的任務(所執行的程式碼)得是支援事務操作的,才能顯出事務的效果來(比如寫資料庫),如果不支援事務,
//則使用這個也無法進行回滾等等(比如寫檔案,更改變數的值,只要成功完成後,即使呼叫ContextUtil.SetAbort也無法對已經完成的操作進行回滾(比如:
//將寫好的檔案變回寫之前的狀態,或者將改變的變更變回原值等等)
//另外ContextUtil.EnableCommit表示對事務處理滿意ContextUtil.DisableCommit表示對事務處理不滿意,但都沒有表示事務完成。
//[AutoComplete()]
public string ProceedStr(string str)
{
MySqlConnection conn = null;

try
{
conn = new MySqlConnection(this.connStr);
string cmdStr = "insert into t1(name) values('wo cao ni ma')";
MySqlCommand cmd = new MySqlCommand(cmdStr, conn);
conn.Open();
cmd.ExecuteNonQuery();
cmd.ExecuteNonQuery();
ContextUtil.SetComplete();//這句提交完成不起作用,要以方法最後執行的設定為準

cmd.CommandText = "insert into t1(name) values('hello')";
cmd.ExecuteNonQuery();
ContextUtil.SetComplete();
return "ok";
}
catch (Exception ex)
{
ContextUtil.SetAbort();//如果沒有下面一句,則整個三句將都沒有插入成功
ContextUtil.SetComplete();//這樣執行後,前兩句沒錯的語句成功插入,最後一句沒有插入
throw ex;
}
finally
{
if (conn != null)
conn.Close();
}

}

#endregion
}
}


無元件:

using System;
using System.Collections.Generic;
using System.Text;
using System.EnterpriseServices;
using MySql.Data;
using MySql.Data.MySqlClient;

namespace NoComptESTest
{
public class NoComptTest
{
//沒有元件的服務就是使用ServiceConfig來配置服務,然後呼叫ServiceDomain.Enter(config)來使用配置建立環境,事務的提交與使用元件的服務是一樣的
//使用ContextUtil或使用[AutoComplete()]屬性來修飾方法,最後再呼叫ServiceDomain.Leave()來釋放環境
//沒有元件的服務是不能擁有全部的功能,而且呼叫的程式也不用像有元件的服務那樣的還需要引用System.EnterpriseServices,只需要引用這個程式集就行了
public static bool Execute(bool isAdd)
{
ServiceConfig config = new ServiceConfig();
config.Transaction = TransactionOption.Required;
ServiceDomain.Enter(config);
MySqlConnection conn = null;
try
{
conn = new MySqlConnection("Database=Test;Data Source=sai;Port=3306;User Id=root;Password=1980425");
string cmdText = "insert into t1(name) values('ni ma bi')";
MySqlCommand cmd = new MySqlCommand(cmdText, conn);

conn.Open();

cmd.ExecuteNonQuery();

cmd.ExecuteNonQuery();

cmd.ExecuteNonQuery();

if (isAdd)
ContextUtil.SetComplete();
else
ContextUtil.SetAbort();
return true;

}
catch (Exception ex)
{
ContextUtil.SetAbort();
Console.WriteLine(ex.ToString());
return false;
}
finally
{
if (conn != null)
conn.Close();
ServiceDomain.Leave();
}
}
}
}


呼叫元件程式碼:
using System;
using System.Collections.Generic;
using System.Text;



namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//EnterpriseServiceTest.TestComponent t = new EnterpriseServiceTest.TestComponent();
//using (t)
//{
//    Console.WriteLine(t.ProceedStr("hiu"));
//}
//test();  
//using(NoComptESTest.NoComptTest)
{
NoComptESTest.NoComptTest.Execute(false);
}
}


}
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-617612/,如需轉載,請註明出處,否則將追究法律責任。

相關文章