Vállalati szolgáltatások tranzakciós összetevőinek integrálása
A Windows Communication Foundation (WCF) automatikus mechanizmust biztosít az Enterprise Services szolgáltatásokkal való integrációhoz (lásd : Integrálás COM+ alkalmazásokkal). Előfordulhat azonban, hogy rugalmasan fejleszthet olyan szolgáltatásokat, amelyek belsőleg az Enterprise Servicesben üzemeltetett tranzakciós összetevőket használják. Mivel a WCF-tranzakciók funkció az System.Transactions infrastruktúrára épül, a nagyvállalati szolgáltatások WCF-sel való integrálásának folyamata megegyezik az Enterprise Services és a Nagyvállalati szolgáltatások közötti System.Transactions interoperabilitás meghatározásának folyamatával, ahogyan az az Enterprise Services és a COM+ tranzakciók közötti együttműködésben is szerepel.
A bejövő forgalom és a COM+ környezeti tranzakció közötti kívánt együttműködési szint biztosításához a szolgáltatás implementációjának létre kell hoznia egy példányt TransactionScope , és a számbavételből származó EnterpriseServicesInteropOption megfelelő értéket kell használnia.
Vállalati szolgáltatások integrálása szolgáltatásművelettel
Az alábbi kód egy engedélyezett tranzakciós folyamattal rendelkező műveletet mutat be, amely létrehoz egy TransactionScopeFull lehetőséget. Ebben a forgatókönyvben a következő feltételek érvényesek:
Ha az ügyfél tranzakciót bonyolít le, a művelet , beleértve az Enterprise Services-összetevő hívását is, a tranzakció hatókörén belül lesz végrehajtva. A használat Full biztosítja, hogy a tranzakció szinkronizálva legyen a System.EnterpriseServices környezettel, ami azt jelenti, hogy a környezeti tranzakció System.TransactionsSystem.EnterpriseServices megegyezik.
Ha az ügyfél nem hajt végre tranzakciót, a
true
beállítás TransactionScopeRequired új tranzakciós hatókört hoz létre a művelethez. Hasonlóképpen, a használat Full biztosítja, hogy a művelet tranzakciója megegyezik az összetevő környezetében használt System.EnterpriseServices tranzakcióval.
A további metódushívások ugyanazon művelet tranzakciójának hatókörén belül is előfordulnak.
[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
}
}
Ha nincs szükség szinkronizálásra egy művelet aktuális tranzakciója és a tranzakciós Enterprise Services-összetevőkre irányuló hívások között, akkor használja a None lehetőséget a TransactionScope példány példányának létrehozásakor.
Vállalati szolgáltatások integrálása ügyféllel
Az alábbi kód bemutatja, hogy az ügyfélkód egy TransactionScope példányt használ a Full beállítással. Ebben a forgatókönyvben a tranzakciófolyamatot támogató szolgáltatásműveletek hívásai ugyanazon tranzakció hatókörén belül történnek, mint az Enterprise Services-összetevőkre irányuló hívások.
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();
}