Condividi tramite


Integrazione di componenti transazionali di Enterprise Services

Windows Communication Foundation (WCF) fornisce un meccanismo automatico per l'integrazione con Enterprise Services (vedere Integrazione con applicazioni COM+). Può tuttavia essere necessario disporre della flessibilità di sviluppare servizi che utilizzano internamente componenti transazionali ospitati all'interno di Enterprise Services. Poiché la funzionalità Transactions di WCF si basa sull'infrastruttura di System.Transactions, il processo per l'integrazione di Enterprise Services con WCF è identico a quello per la specifica dell'interoperabilità tra System.Transactions ed Enterprise Services, come descritto in Interoperabilità con le transazioni Enterprise Services e COM+ (la pagina potrebbe essere in inglese).

Per fornire il livello desiderato di interoperabilità tra la transazione propagata in ingresso e la transazione in contesto COM+, l'implementazione del servizio deve creare un'istanza della classe TransactionScope e deve utilizzare il valore appropriato ricavato dall'enumerazione EnterpriseServicesInteropOption.

Integrazione di Enterprise Services con un'operazione del servizio

Nel codice seguente viene illustrata un'operazione, con propagazione transazionale Allowed, che crea una classe TransactionScope con l'opzione Full. In questo scenario vengono applicate le condizioni seguenti:

  • Se il client propaga una transazione, l'operazione, inclusa la chiamata al componente Enterprise Services, viene eseguita all'interno dell'ambito di tale transazione. L'utilizzo di Full garantisce la sincronizzazione della transazione con il contesto System.EnterpriseServices, il che significa che la transazione di ambiente per System.Transactions e System.EnterpriseServices è la stessa.

  • Se il client non propaga una transazione, l'impostazione di TransactionScopeRequired su true crea un nuovo ambito di transazione per l'operazione. Analogamente, l'utilizzo di Full garantisce che la transazione dell'operazione sia la stessa transazione utilizzata all'interno del contesto del componente System.EnterpriseServices.

Eventuali chiamate aggiuntive al metodo avvengono anch'esse nell'ambito della stessa transazione dell'operazione.

[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 non è necessaria alcuna sincronizzazione tra la transazione corrente di un'operazione e le chiamate ai componenti Enterprise Services transazionali, utilizzare l'opzione None quando si crea l'istanza di TransactionScope.

Integrazione di Enterprise Services con un client

Nell'esempio seguente viene illustrato il codice client utilizzando un'istanza della classe TransactionScope con l'impostazione Full In questo scenario, le chiamate alle operazioni del servizio che supportano la propagazione transazionale avvengono nell'ambito della stessa transazione delle chiamate ai componenti 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();  
}  

Vedi anche