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