Partager via


Intégration de composants transactionnels Enterprise Services

Windows Communication Foundation (WCF) offre un mécanisme permettant l'intégration automatique des composants Enterprise Services (consultez Intégration à 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 des composants Enterprise Services à WCF est identique à celui utilisé pour spécifier l'interopérabilité de System.Transactions avec Enterprise Services, comme abordé dans Interopérabilité des transactions COM+ avec Enterprise Services (page pouvant être en anglais).

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 portée 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 true àTransactionScopeRequired 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

Autres ressources

COM+ Integration: Web-Hosted
Intégration à des applications COM+
Intégration à des applications COM