Udostępnij za pośrednictwem


Integrowanie składników transakcyjnych usług dla przedsiębiorstw

Program Windows Communication Foundation (WCF) zapewnia automatyczny mechanizm integracji z usługami Enterprise Services (zobacz Integrowanie z aplikacjami COM+). Możesz jednak chcieć elastycznie opracowywać usługi, które wewnętrznie korzystają ze składników transakcyjnych hostowanych w ramach usług Enterprise Services. Ponieważ funkcja transakcji WCF jest oparta na System.Transactions infrastrukturze, proces integrowania usług Enterprise Services z usługami WCF jest identyczny z tym, który określa współdziałanie między usługami System.Transactions i usługami przedsiębiorstwa, zgodnie z opisem w temacie Współdziałanie z usługami przedsiębiorstwa i transakcjami COM+.

Aby zapewnić żądany poziom współdziałania między przychodzącą transakcją przepływaną a transakcją kontekstową COM+, implementacja usługi musi utworzyć TransactionScope wystąpienie i użyć odpowiedniej wartości z EnterpriseServicesInteropOption wyliczenia.

Integrowanie usług Enterprise Services z operacją usługi

Poniższy kod demonstruje operację z dozwolonym przepływem transakcji, która tworzy element TransactionScope z opcją Full . W tym scenariuszu obowiązują następujące warunki:

  • Jeśli klient przepływa transakcję, operacja, w tym wywołanie składnika usług Enterprise Services, jest wykonywana w zakresie tej transakcji. Użycie Full gwarantuje, że transakcja jest zsynchronizowana z kontekstem System.EnterpriseServices , co oznacza, że otoczenia transakcji System.Transactions i System.EnterpriseServices jest taka sama.

  • Jeśli klient nie przepływa transakcji, ustawienie TransactionScopeRequiredtrue powoduje utworzenie nowego zakresu transakcji dla operacji. Podobnie użycie Full gwarantuje, że transakcja operacji jest taka sama jak transakcja używana w System.EnterpriseServices kontekście składnika.

Wszelkie dodatkowe wywołania metody również występują w zakresie transakcji tej samej operacji.

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

Jeśli nie jest wymagana synchronizacja między bieżącą transakcją operacji a wywołaniami składników transakcyjnych usług Enterprise Services, użyj None opcji podczas tworzenia wystąpienia TransactionScope wystąpienia.

Integrowanie usług Enterprise Services z klientem

Poniższy kod demonstruje kod klienta przy użyciu TransactionScope wystąpienia z ustawieniem Full . W tym scenariuszu wywołania operacji usługi, które obsługują przepływ transakcji, występują w zakresie tej samej transakcji co wywołania składników usług 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();  
}  

Zobacz też