Integrera transaktionskomponenter för Enterprise Services
Windows Communication Foundation (WCF) tillhandahåller en automatisk mekanism för integrering med Enterprise Services (se Integrera med COM+-program). Du kanske dock vill ha flexibiliteten att utveckla tjänster som internt använder transaktionskomponenter som finns i Enterprise Services. Eftersom WCF-transaktionsfunktionen bygger på System.Transactions infrastrukturen är processen för att integrera Enterprise Services med WCF identisk med den för att ange samverkan mellan System.Transactions och Enterprise Services, enligt beskrivningen i Samverkan med Enterprise Services och COM+-transaktioner.
För att tillhandahålla önskad nivå av samverkan mellan den inkommande flödestransaktionen och COM+-kontexttransaktionen måste tjänstimplementeringen skapa en TransactionScope instans och använda lämpligt värde från EnterpriseServicesInteropOption uppräkningen.
Integrera Enterprise Services med en tjänståtgärd
Följande kod visar en åtgärd, med Tillåtet transaktionsflöde, som skapar en TransactionScope med alternativet Full . Följande villkor gäller i det här scenariot:
Om klienten flödar en transaktion körs åtgärden, inklusive anropet till Enterprise Services-komponenten, inom transaktionens omfång. Att använda Full säkerställer att transaktionen synkroniseras med kontexten System.EnterpriseServices , vilket innebär att den omgivande transaktionen för System.Transactions och System.EnterpriseServices är densamma.
Om klienten inte flödar en transaktion skapar inställningen TransactionScopeRequired ett
true
nytt transaktionsomfång för åtgärden. På samma sätt säkerställer användningen Full att åtgärdens transaktion är densamma som den transaktion som används i komponentens System.EnterpriseServices kontext.
Eventuella ytterligare metodanrop sker också inom omfånget för samma åtgärds transaktion.
[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
}
}
Om ingen synkronisering krävs mellan en åtgärds aktuella transaktion och anrop till transaktionella Enterprise Services-komponenter använder du None alternativet när du instansierar instansen TransactionScope .
Integrera Enterprise Services med en klient
Följande kod visar klientkod med hjälp av en TransactionScope instans med inställningen Full . I det här scenariot sker anrop till tjänståtgärder som stöder transaktionsflöde inom omfånget för samma transaktion som anropen till Enterprise Services-komponenter.
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();
}