Compartilhar via


Integração de componentes transacionais de Enterprise Services

O WCF (Windows Communication Foundation) oferece um mecanismo automático para integração com os Serviços Enterprise (consulte Integração com aplicativos COM+). No entanto, talvez você queira a flexibilidade para desenvolver serviços que usam internamente componentes transacionais hospedados nos Serviços Enterprise. Como o recurso Transações do WCF é criado na infraestrutura System.Transactions, o processo de integração dos Serviços Enterprise com o WCF é idêntico ao especificar a interoperabilidade entre o System.Transactions e os Serviços Enterprise, conforme descrito na Interoperabilidade com os Serviços Enterprise e transações COM+.

Para fornecer o nível desejado de interoperabilidade entre a transação fluida de entrada e a transação de contexto COM+, a implementação do serviço precisa criar uma instância TransactionScope e usar o valor apropriado da enumeração EnterpriseServicesInteropOption.

Integrando os Serviços Enterprise a uma operação de serviço

O código a seguir demonstra uma operação, com fluxo de transação permitido, que cria um TransactionScope com a opção Full . As seguintes condições se aplicam neste cenário:

  • Se o cliente fizer o fluxo de uma transação, a operação, incluindo a chamada para o componente dos Serviços Enterprise, será executada dentro do escopo dessa transação. Usar Full garante que a transação seja sincronizada com o contexto System.EnterpriseServices, o que significa que a transação de ambiente de System.Transactions e o System.EnterpriseServices são iguais.

  • Se o cliente não fizer o fluxo de uma transação, configurar TransactionScopeRequired como true cria um novo escopo de transação para a operação. Da mesma forma, usar Full garante que a transação da operação seja igual à transação usada dentro do contexto do componente System.EnterpriseServices.

Chamadas de método adicionais também ocorrem no escopo da transação da mesma operação.

[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  
   }  
}  

Se nenhuma sincronização for necessária entre a transação atual de uma operação e as chamadas para componentes transacionais dos Serviços Enterprise, use a opção None ao instanciar a instância TransactionScope.

Integrando Serviços Enterprise com um cliente

O código a seguir demonstra o código do cliente usando uma instância TransactionScope com a configuração Full. Nesse cenário, as chamadas para operações de serviço que pemitem o fluxo de transação ocorrem no escopo da mesma transação que as chamadas para componentes dos Serviços Enterprise.

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();  
}  

Confira também