Transactionele onderdelen van Enterprise Services integreren
Windows Communication Foundation (WCF) biedt een automatisch mechanisme voor integratie met Enterprise Services (zie Integratie met COM+-toepassingen). Mogelijk wilt u echter de flexibiliteit om services te ontwikkelen die intern gebruikmaken van transactionele onderdelen die worden gehost in Enterprise Services. Omdat de wcF-transactiesfunctie is gebouwd op de System.Transactions infrastructuur, is het proces voor de integratie van Enterprise Services met WCF identiek aan dat voor het opgeven van interoperabiliteit tussen System.Transactions en Enterprise Services, zoals wordt beschreven in Interoperabiliteit met Enterprise Services en COM+ Transacties.
Om het gewenste interoperabiliteitsniveau te bieden tussen de binnenkomende transactie en de COM+-contexttransactie, moet de service-implementatie een TransactionScope exemplaar maken en de juiste waarde uit de EnterpriseServicesInteropOption opsomming gebruiken.
Enterprise Services integreren met een servicebewerking
De volgende code toont een bewerking, met de toegestane transactiestroom, waarmee een TransactionScope bewerking wordt gemaakt met de Full optie. De volgende voorwaarden zijn van toepassing in dit scenario:
Als de client een transactie doorloopt, wordt de bewerking, inclusief de aanroep naar het onderdeel Enterprise Services, uitgevoerd binnen het bereik van die transactie. Het gebruik Full zorgt ervoor dat de transactie wordt gesynchroniseerd met de System.EnterpriseServices context, wat betekent dat de omgevingstransactie voor System.Transactions en de System.EnterpriseServices transactie hetzelfde is.
Als de client geen transactie doorstroomt, maakt TransactionScopeRequired
true
u een nieuw transactiebereik voor de bewerking. Op dezelfde manier zorgt het gebruik Full ervan ervoor dat de transactie van de bewerking hetzelfde is als de transactie die in de context van het System.EnterpriseServices onderdeel wordt gebruikt.
Eventuele extra methode-aanroepen vinden ook plaats binnen het bereik van de transactie van dezelfde bewerking.
[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
}
}
Als er geen synchronisatie is vereist tussen de huidige transactie van een bewerking en aanroepen naar transactionele Enterprise Services-onderdelen, gebruikt u de None optie bij het instantiƫren van het TransactionScope exemplaar.
Enterprise Services integreren met een client
De volgende code demonstreert clientcode met behulp van een TransactionScope exemplaar met de Full instelling. In dit scenario worden aanroepen naar servicebewerkingen die de transactiestroom ondersteunen, uitgevoerd binnen het bereik van dezelfde transactie als de aanroepen naar Enterprise Services-onderdelen.
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();
}