エンタープライズ サービスのトランザクション コンポーネントの統合

Windows Communication Foundation (WCF) は、エンタープライズ サービスと統合するための自動的な機構を提供します (「COM+ アプリケーションとの統合」を参照)。ただし、柔軟性を高めるために、エンタープライズ サービス内でホストされるトランザクション コンポーネントを内部的に使用するサービスを開発する場合があります。WCF のトランザクション機能は System.Transactions インフラストラクチャ上に構築されているため、エンタープライズ サービスと WCF との統合プロセスは、「Enterprise Service および COM+ トランザクションとの相互運用性」で概説されている System.Transactions とエンタープライズ サービス間の相互運用性を指定するプロセスと同じになります。

フローされる受信トランザクションと COM+ コンテキスト トランザクションの間に必要なレベルの相互運用性を提供するには、サービス実装で TransactionScope インスタンスを作成し、EnterpriseServicesInteropOption 列挙型の適切な値を使用する必要があります。

エンタープライズ サービスとサービス操作の統合

Allowed トランザクション フローで、Full オプションを指定して TransactionScope を作成する操作を次のコードに示します。このシナリオでは次の条件が適用されます。

  • クライアントがトランザクションをフローする場合、エンタープライズ サービス コンポーネント呼び出しを含む操作は、トランザクションのスコープ内で実行されます。Full を使用すると、トランザクションが System.EnterpriseServices コンテキストと同期することが保証されます。つまり、System.Transactions のアンビエント トランザクションと System.EnterpriseServices とが同じになります。

  • クライアントがトランザクションをフローしない場合、TransactionScopeRequiredtrue に設定すると操作の新しいトランザクション スコープが作成されます。同様に、Full を使用すると、操作のトランザクションが System.EnterpriseServices コンポーネントのコンテキスト内で使用されるトランザクションと同じになることが保証されます。

任意の追加のメソッド呼び出しも、同じ操作のトランザクションのスコープ内で行われます。

[ServiceContract()]
public interface ICustomerServiceContract
{
   [OperationContract]
   [TransactionFlow(TransactionFlowOption.Allowed)]
   void UpdateCustomerNameOperation(int customerID, string newCustomerName);
}

[ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable)]
public class CustomerService : ICustomerServiceContract
{
   [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
   public void UpdateCustomerNameOperation(int customerID, string newCustomerName)
   {
   // Create a transaction scope with full ES interop
      using (TransactionScope ts = new TransactionScope(
                     TransactionScopeOption.Required,
                     new TransactionOptions(),
                     EnterpriseServicesInteropOption.Full))
      {
         // Create an Enterprise Services component
         // Call UpdateCustomer method on an Enterprise Services 
         // component 

         // Call UpdateOtherCustomerData method on an Enterprise 
         // Services component 
         ts.Complete();
      }

      // Do UpdateAdditionalData on an non-Enterprise Services
      // component
   }
}

操作の現在のトランザクションと、エンタープライズ サービスのトランザクション コンポーネント呼び出しとの間の同期が不要な場合は、TransactionScope インスタンスのインスタンス化時に None オプションを使用する必要があります。

エンタープライズ サービスとクライアントの統合

Full を設定した TransactionScope インスタンスを使用するクライアント コードを次のコードに示します。このシナリオでは、トランザクション フローをサポートするサービス操作の呼び出しが、エンタープライズ サービス コンポーネントへの呼び出しと同じトランザクションのスコープ内で発生します。

static void Main()
{
    // Create a client
    CalculatorClient client = new CalculatorClient();

    // Create a transaction scope with full ES interop
    using (TransactionScope ts = new TransactionScope(
          TransactionScopeOption.Required,
          new TransactionOptions(),
          EnterpriseServicesInteropOption.Full))
    {
        // Call Add calculator service operation

        // Create an Enterprise Services component

        // Call UpdateCustomer method on an Enterprise Services 
        // component 

        ts.Complete();
    }

    // Closing the client gracefully closes the connection and 
    // cleans up resources
    client.Close();
}

参照

その他のリソース

COM+ Integration: Web-Hosted
COM+ アプリケーションとの統合
COM アプリケーションとの統合