コード例
次の手順と例では、ServicedComponent クラスから派生したクラスで COM+ の BYOT 機能を使用して分散トランザクション コーディネータ (DTC : Distributed Transaction Coordinator) にアクセスする方法を示します。System.EnterpriseServices 名前空間内から BYOT 機能を使用する方法については、「BYOT (Bring Your Own Transaction)」を参照してください。
別のオブジェクトのトランザクションを使用するオブジェクトを作成するには
-
ServicedComponent クラスから派生するクラスを定義し、現在の COM+ DTC トランザクション オブジェクトを返すパブリック プロパティを公開します。たとえば、次のコードでは、Base クラスが ServicedComponent クラスを継承しており、オブジェクトがインスタンス化された現在の COM+ DTC トランザクションの ContextUtil.Transaction オブジェクトを返すパブリップ プロパティがあります。
Imports System.EnterpriseServices
Public Class Base
Inherits ServicedComponent
Public Readonly Property Transaction() as Object
Get
Return ContextUtil.Transaction
End Get
End Property
End Class
using System.EnterpriseServices;
public class Base : ServicedComponent
{
public Object Transaction
{
get { return ContextUtil.Transaction; }
}
}
-
手順 1 で定義されたクラスから派生する 2 つのクラスを作成し、両方のクラスに Transaction 属性を設定します。たとえば、次のコードは、Base クラスから派生する CTransaction1 と CTransaction2 の 2 つのクラスを宣言し、Transaction 属性を設定します。
<Transaction()> Public Class CTransaction1
Inherits Base
' Insert your transaction logic here.
End Class
<Transaction()> Public Class CTransaction2
Inherits Base
' Insert your transaction logic here.
End Class
[Transaction]
public class CTransaction1 : Base
{
// Insert your transaction logic here.
}
[Transaction]
public class CTransaction2 : Base
{
// Insert your transaction logic here.
}
-
手順 2 で作成されたクラスを使用するクライアント アプリケーションを作成して、BYOT 機能をテストします。
-
手順 2 で定義したクラスの 1 つのインスタンスを作成します。たとえば、次のコードは、CTransaction1 クラスのインスタンスを作成します。
Class BYOTDemonstration
Public Shared Sub Main()
Dim tx1 as New CTransaction1
End Sub
End Class
class BYOTDemonstration
{
static void Main()
{
CTransaction1 tx1 = new CTransaction1();
}
}
-
現在の COM+ DTC トランザクションを、手順 3.a で作成されたオブジェクトから取得します。たとえば、次のコードは、Transaction オブジェクトを、CTransaction1 クラスのパブリック プロパティである Transaction から取得します。
Dim tx as Object = tx1.Transaction
Object tx = tx1.Transaction;
-
手順 3.b で取得した Transaction オブジェクトを使用して、手順 2 で定義した 2 番目のクラスのインスタンスを作成します。たとえば、次のコードは、手順 3.b で取得した Transaction を使用して CTransaction2 クラスのインスタンスを作成します。
Dim tx2 as CTransaction2 = ctype(BYOT.CreateWithTransaction(tx, _ gettype(CTransaction2)),CTransaction2)
CTransaction2 tx2 = (CTransaction2)BYOT.CreateWithTransaction(tx,
typeof(CTransaction2));
-
強力なキーを生成して次の例をコンパイルします。
sn –k BYOTDemo.snk
vbc /r:System.EnterpriseServices.dll BYOTDemo.vb
使用例
Imports System
Imports System.Reflection
Imports System.EnterpriseServices
<assembly: AssemblyKeyFile("BYOTDemo.snk")>
Public Class Base
Inherits ServicedComponent
Public Readonly Property Transaction() as Object
Get
Return ContextUtil.Transaction
End Get
End Property
End Class
<Transaction()> Public Class CTransaction1
Inherits Base
' Insert your transaction logic here.
End Class
<Transaction()> Public Class CTransaction2
Inherits Base
' Insert your transaction logic here.
End Class
Class BYOTDemonstration
Public Shared Sub Main()
' Create a transactional object, and then get its
' transaction.
Dim tx1 as New CTransaction1
Console.WriteLine("Created transaction1.")
Dim tx as Object = tx1.Transaction
Console.WriteLine("Got the transaction of transaction1.")
Dim tx2 as CTransaction2 = ctype(BYOT.CreateWithTransaction(tx, _ gettype(CTransaction2)),CTransaction2)
Console.WriteLine("Created transaction2 with the _
transaction of transaction1.")
End Sub
End Class
using System;
using System.Reflection;
using System.EnterpriseServices;
[assembly: AssemblyKeyFileAttribute("byotdemo.snk")]
public class Base : ServicedComponent
{
public Object Transaction
{
get { return ContextUtil.Transaction; }
}
}
[Transaction]
public class CTransaction1 : Base
{
// Insert your transaction logic here.
}
[Transaction]
public class CTransaction2 : Base
{
// Insert your transaction logic here.
}
class BYOTDemonstration
{
static void Main()
{
/* Create a transactional object, and then get its
transaction. */
CTransaction1 tx1 = new CTransaction1();
Console.WriteLine("Created transaction1.");
Object tx = tx1.Transaction;
Console.WriteLine("Got the transaction of transaction1.");
CTransaction2 tx2 = (CTransaction2)BYOT.CreateWithTransaction(tx, typeof(CTransaction2));
Console.WriteLine("Created transaction2 using the transaction of transaction1.");
}
}
参照