Partager via


Intégration de composants transactionnels Enterprise Services

Windows Communication Foundation (WCF) fournit un mécanisme automatique pour l’intégration avec Enterprise Services (voir Intégration avec des applications COM+). Cependant, vous préférez peut-être pouvoir développer des services utilisant en interne des composants transactionnels hébergés par Enterprise Services. La fonctionnalité des Transactions WCF s’appuyant sur l’infrastructure System.Transactions, le processus d’intégration d’Enterprise Services avec WCF est identique au processus de spécification de l’interopérabilité entre System.Transactions et Enterprise Services, comme décrit dans Interopérabilité avec Enterprise Services et les Transactions COM+.

Afin d’offrir un niveau d’interopérabilité suffisant entre les transactions entrantes et les transactions de contexte COM+, l’implémentation de service doit créer une instance TransactionScope et utiliser la valeur appropriée de l’énumération EnterpriseServicesInteropOption.

Intégration des composants Enterprise Services à une opération de service

L’exemple de code suivant contient une opération (autorisant le transfert des transactions) qui crée une étendue TransactionScope à l’aide de l’option Full. Les conditions suivantes s'appliquent à notre exemple :

  • Si le client transfère une transaction, l'opération, y compris l'appel au composant Enterprise Services, est exécutée dans les limites de portée de cette transaction. L’utilisation de Full assure la synchronisation de la transaction avec le contexte System.EnterpriseServices, ce qui signifie que la transaction ambiante de System.Transactions correspond à celle de System.EnterpriseServices.

  • Si le client ne transfère pas de transaction, affecter la valeur TransactionScopeRequired àtrue attribue une nouvelle portée de transaction à l'opération. De la même façon, l'utilisation de Full garantit que la transaction de l'opération correspond à la transaction utilisée dans le contexte du composant System.EnterpriseServices.

Tous les appels de méthode supplémentaires se produisent également dans les limites de portée de transaction de la même opération.

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

Si aucune synchronisation n'est requise entre la transaction en cours d'une opération et les appels aux composants transactionnels Enterprise Services, utilisez l'option None lorsque vous instanciez l'instance TransactionScope.

Intégration des composants Enterprise Services à un client

L'exemple de code suivant contient un code client qui utilise une instance TransactionScope avec le paramètre Full. Dans cet exemple de code, les appels aux opérations de service qui prennent en charge le transfert des transactions se produisent dans les mêmes limites de portée de transaction que les appels aux composants Enterprise Services, leurs transactions étant identiques.

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

Voir aussi