Integración de los componentes transaccionales de Enterprise Services
Windows Communication Foundation (WCF) proporciona un mecanismo automático para la integración con Enterprise Services (consulte Integración con aplicaciones COM+). Sin embargo, puede querer flexibilidad para desarrollar servicios que utilicen internamente componentes transaccionales hospedados en Enterprise Services. Dado que la característica Transacciones WCF se crea en la infraestructura System.Transactions, el proceso para integrar Enterprise Services con WCF es idéntico a la especificación de interoperabilidad entre System.Transactions y Enterprise Services, tal y como se describe en Interoperabilidad con Enterprise Services y transacciones COM+.
Para proporcionar el nivel deseado de interoperabilidad entre la transacción fluida entrante y la transacción de contexto de COM+, la implementación del servicio debe crear una instancia TransactionScope y utilizar el valor adecuado de la enumeración EnterpriseServicesInteropOption.
Integración de Enterprise Services con una operación de servicio
El código siguiente muestra una operación, con flujo de transacción permitido, que crea un TransactionScope con la opción Full. Las condiciones siguientes se aplican en este escenario:
Si el cliente fluye una transacción, la operación, incluida la llamada al componente Enterprise Services, se ejecuta dentro del ámbito de esa transacción. El uso de Full asegura que la transacción se sincroniza con el contexto System.EnterpriseServices, lo que significa que la transacción ambiente para System.Transactions y System.EnterpriseServices es la misma.
Si el cliente no fluye una transacción, al establecer TransactionScopeRequired en
true
se crea un nuevo ámbito de transacción para la operación. De igual forma, utilizar Full garantiza que la transacción de la operación es igual que la transacción utilizada dentro del contexto del componente System.EnterpriseServices.
Cualquier llamada adicional al método también se produce dentro del ámbito de la transacción de la misma operación.
[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
}
}
Si no se necesita ninguna sincronización entre la transacción actual de la operación y las llamadas a los componentes transaccionales de Enterprise Services, después utilice la opción None cuando cree instancias de la instancia TransactionScope.
Integración de Enterprise Services con un cliente
El código siguiente muestra código de cliente utilizando una instancia TransactionScope con el valor Full. En este escenario, las llamadas a las operaciones de servicio que admiten el flujo de la transacción se producen dentro del ámbito de la misma transacción como las llamadas a los componentes de 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();
}