Partilhar via


Integrando componentes transacionais de serviços corporativos

O Windows Communication Foundation (WCF) fornece um mecanismo automático para integração com o Enterprise Services (consulte Integrando com aplicativos COM+). No entanto, você pode querer a flexibilidade para desenvolver serviços que usam internamente componentes transacionais hospedados no Enterprise Services. Como o recurso Transações WCF é criado na System.Transactions infraestrutura, o processo de integração de Serviços Corporativos com WCF é idêntico ao processo para especificar a interoperabilidade entre System.Transactions e Serviços Corporativos, conforme descrito em Interoperabilidade com Serviços Empresariais e Transações COM+.

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

Integrando serviços corporativos com 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 Full opção. As seguintes condições se aplicam nesse cenário:

  • Se o cliente flui uma transação, a operação, incluindo a chamada para o componente Enterprise Services, é executada dentro do escopo dessa transação. Usar Full garante que a transação seja sincronizada com o contexto, o System.EnterpriseServices que significa que a transação de ambiente para System.Transactions e o System.EnterpriseServices é a mesma.

  • Se o cliente não fluir uma transação, a configuração TransactionScopeRequired para true criará um novo escopo de transação para a operação. Da mesma forma, o uso Full garante que a transação da operação seja a mesma que a transação usada dentro do contexto do System.EnterpriseServices componente.

Quaisquer chamadas de método adicionais também ocorrem dentro do 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 do Enterprise Services, use a None opção ao instanciar a TransactionScope instância.

Integrando serviços corporativos com um cliente

O código a seguir demonstra o código do cliente usando uma TransactionScope instância com a Full configuração. Nesse cenário, as chamadas para operações de serviço que oferecem suporte ao fluxo de transação ocorrem dentro do escopo da mesma transação que as chamadas para componentes do 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();  
}  

Consulte também