Интеграция транзакционных компонентов служб Enterprise Services
Windows Communication Foundation (WCF) обеспечивает автоматический механизм интеграции со службами Enterprise Services (см. раздел Интеграция с приложениями COM+). Однако для разработки служб, которые внутренне используют транзакционные компоненты, размещенные внутри служб Enterprise Services, может потребоваться гибкость. Поскольку возможность транзакций WCF встроена в инфраструктуру System.Transactions, процесс интеграции служб Enterprise Services с WCF идентичен процессу задания взаимодействия между System.Transactions и Enterprise Services, как описано в разделе Взаимодействие с транзакциями Enterprise Services и COM+.
Чтобы обеспечить требуемый уровень взаимодействия между входящей поточной транзакцией и транзакцией контекста COM+, реализация службы должна создать экземпляр TransactionScope и использовать соответствующее значение из перечисления EnterpriseServicesInteropOption.
Интеграция служб Enterprise Services с операцией службы
В представленном ниже коде показана операция с разрешенным потоком транзакций, которая создает область TransactionScope с параметром Full. В этом сценарии используются следующие условия.
Если клиент передает транзакцию, операция, включая вызов компонента Enterprise Services, выполняется в рамках области этой транзакции. Использование параметра Full обеспечивает синхронизацию транзакции с контекстом System.EnterpriseServices. Это означает, что внешняя транзакция для System.Transactions и System.EnterpriseServices одна и та же.
Если клиент не передает транзакцию, при присвоении TransactionScopeRequired значения true для операции создается новая область транзакции. Аналогично, использование параметра Full обеспечивает идентичность транзакции операции и транзакции, используемой внутри контекста компонента System.EnterpriseServices.
Любые дополнительные вызовы метода также происходят в пределах области той же транзакции операции.
[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
}
}
Если между текущей транзакцией операции и вызовами транзакционных компонентов Enterprise Services синхронизация не требуется, при создании экземпляра TransactionScope используйте параметр None.
Интеграция служб Enterprise Services с клиентом
В представленном ниже клиентском коде показано использование экземпляра TransactionScope с параметром Full. В этом сценарии вызовы операций службы, которые поддерживают поток транзакций, происходят в рамках области той же транзакции, что и вызовы компонентов 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();
}
См. также
Другие ресурсы
COM+ Integration: Web-Hosted
Интеграция с приложениями COM+
Интеграция с приложениями COM