Mengintegrasikan Komponen Transaksional Layanan Enterprise
Windows Communication Foundation (WCF) menyediakan mekanisme otomatis untuk mengintegrasikan dengan Layanan Perusahaan (lihat Mengintegrasikan dengan Aplikasi COM+). Namun, Anda mungkin menginginkan fleksibilitas untuk mengembangkan layanan yang secara internal menggunakan komponen transaksional yang dihosting dalam Layanan Perusahaan. Karena fitur Transaksi WCF dibangun di atas infrastruktur System.Transactions, proses untuk mengintegrasikan Layanan Perusahaan dengan WCF identik dengan itu untuk menentukan interoperabilitas antara System.Transactions dan Layanan Perusahaan, seperti yang diuraikan dalam Interoperabilitas dengan Layanan Perusahaan dan Transaksi COM+.
Untuk memberikan tingkat interoperabilitas yang diinginkan antara transaksi aliran masuk dan transaksi konteks COM+, implementasi layanan harus membuat instans TransactionScope dan menggunakan nilai yang sesuai dari enumerasi EnterpriseServicesInteropOption.
Mengintegrasikan Layanan Perusahaan dengan Operasi Layanan
Kode berikut menunjukkan operasi, dengan Alur transaksi yang diizinkan, yang membuat TransactionScope dengan opsi Full. Kondisi berikut berlaku dalam skenario ini:
Jika klien mengalirkan transaksi, operasi, termasuk panggilan ke komponen Layanan Perusahaan, dijalankan dalam cakupan transaksi tersebut. Menggunakan Full memastikan bahwa transaksi disinkronkan dengan konteks System.EnterpriseServices, yang berarti bahwa transaksi sekitar untuk System.Transactions dan System.EnterpriseServices sama.
Jika klien tidak mengalirkan transaksi, mengatur TransactionScopeRequired ke
true
membuat cakupan transaksi baru untuk operasi. Demikian pula, menggunakan Full memastikan bahwa transaksi operasi sama dengan transaksi yang digunakan di dalam konteks komponen System.EnterpriseServices.
Setiap panggilan metode tambahan juga terjadi dalam cakupan transaksi operasi yang sama.
[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
}
}
Jika tidak ada sinkronisasi yang diperlukan antara transaksi operasi saat ini dan panggilan ke komponen Layanan Perusahaan transaksional, maka gunakan opsi None saat membuat instans TransactionScope.
Mengintegrasikan Layanan Perusahaan dengan Klien
Kode berikut menunjukkan kode klien menggunakan instans TransactionScope dengan pengaturan Full. Dalam skenario ini, panggilan ke operasi layanan yang mendukung alur transaksi terjadi dalam cakupan transaksi yang sama dengan panggilan ke komponen Layanan Perusahaan.
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();
}