Integração de componentes transacionais de Enterprise Services
O WCF (Windows Communication Foundation) oferece um mecanismo automático para integração com os Serviços Enterprise (consulte Integração com aplicativos COM+). No entanto, talvez você queira a flexibilidade para desenvolver serviços que usam internamente componentes transacionais hospedados nos Serviços Enterprise. Como o recurso Transações do WCF é criado na infraestrutura System.Transactions, o processo de integração dos Serviços Enterprise com o WCF é idêntico ao especificar a interoperabilidade entre o System.Transactions e os Serviços Enterprise, conforme descrito na Interoperabilidade com os Serviços Enterprise e transações COM+.
Para fornecer o nível desejado de interoperabilidade entre a transação fluida de entrada e a transação de contexto COM+, a implementação do serviço precisa criar uma instância TransactionScope e usar o valor apropriado da enumeração EnterpriseServicesInteropOption.
Integrando os Serviços Enterprise a uma operação de serviço
O código a seguir demonstra uma operação, com fluxo de transação permitido, que cria um TransactionScope com a opção Full . As seguintes condições se aplicam neste cenário:
Se o cliente fizer o fluxo de uma transação, a operação, incluindo a chamada para o componente dos Serviços Enterprise, será executada dentro do escopo dessa transação. Usar Full garante que a transação seja sincronizada com o contexto System.EnterpriseServices, o que significa que a transação de ambiente de System.Transactions e o System.EnterpriseServices são iguais.
Se o cliente não fizer o fluxo de uma transação, configurar TransactionScopeRequired como
true
cria um novo escopo de transação para a operação. Da mesma forma, usar Full garante que a transação da operação seja igual à transação usada dentro do contexto do componente System.EnterpriseServices.
Chamadas de método adicionais também ocorrem no escopo da transação da mesma operação.
[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
}
}
Se nenhuma sincronização for necessária entre a transação atual de uma operação e as chamadas para componentes transacionais dos Serviços Enterprise, use a opção None ao instanciar a instância TransactionScope.
Integrando Serviços Enterprise com um cliente
O código a seguir demonstra o código do cliente usando uma instância TransactionScope com a configuração Full. Nesse cenário, as chamadas para operações de serviço que pemitem o fluxo de transação ocorrem no escopo da mesma transação que as chamadas para componentes dos Serviços Enterprise.
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();
}