Поделиться через


Интеграция транзакционных компонентов служб Enterprise Services

Windows Communication Foundation (WCF) обеспечивает автоматический механизм интеграции со службами Enterprise Services (см. раздел Интеграция с приложениями COM+). Однако для разработки служб, которые внутренне используют транзакционные компоненты, размещенные внутри служб Enterprise Services, может потребоваться гибкость. Поскольку возможность транзакций WCF встроена в инфраструктуру System.Transactions, процесс интеграции служб Enterprise Services с WCF идентичен процессу задания взаимодействия между System.Transactions и Enterprise Services, как описано в разделе Взаимодействие с транзакциями Enterprise Services и COM+.

Чтобы обеспечить требуемый уровень взаимодействия между входящей поточной транзакцией и транзакцией контекста COM+, реализация службы должна создать экземпляр TransactionScope и использовать соответствующее значение из перечисления EnterpriseServicesInteropOption.

Интеграция служб Enterprise Services с операцией службы

В представленном ниже коде показана операция с разрешенным потоком транзакций, которая создает область TransactionScope с параметром Full. В этом сценарии используются следующие условия.

  • Если клиент передает транзакцию, операция, включая вызов компонента Enterprise Services, выполняется в рамках области этой транзакции. Использование параметра Full обеспечивает синхронизацию транзакции с контекстом System.EnterpriseServices. Это означает, что внешняя транзакция для System.Transactions и System.EnterpriseServices одна и та же.

  • Если клиент не передает транзакцию, при присвоении TransactionScopeRequired значения true для операции создается новая область транзакции. Аналогично, использование параметра 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
   }
}

Если между текущей транзакцией операции и вызовами транзакционных компонентов Enterprise Services синхронизация не требуется, при создании экземпляра TransactionScope используйте параметр None.

Интеграция служб Enterprise Services с клиентом

В представленном ниже клиентском коде показано использование экземпляра TransactionScope с параметром Full. В этом сценарии вызовы операций службы, которые поддерживают поток транзакций, происходят в рамках области той же транзакции, что и вызовы компонентов Enterprise Services.

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