![]() | |||||||
COM+ Component'i oluşturmadan COM+ Servislerinden Faydalanmak - 2 | 29.05.2005 04:40:00 | ||||||
| Kategori : .NET Framework Özet : COM+ Component'i oluşturmadan COM+ Servislerinden Faydalanmak makalemizin birinci bölümünde COM+ ile transaction servisini COM+ componenti oluşturmadan nasıl kullanacağımız incelemiş ve örneklendirmiştik. Bu makalemizde ise COM+ Transaction servisinden faydalanarak farklı sınıflar içerisinde çalıştırılan birbirinden bağımsız ancak iş kuralı olarak tek iş olan işlemleri tek bir transaction içerisinde çalıştıracağız. | |||||||
|
COM+ Component'i oluşturmadan COM+ Servislerinden Faydalanmak - 2 COM+ Component'i oluşturmadan COM+ Servislerinden Faydalanmak makalemizin birinci bölümünde COM+ ile transaction servisini COM+ componenti oluşturmadan nasıl kullanacağımız incelemiş ve örneklendirmiştik. Bu makalemizde ise COM+ Transaction servisinden faydalanarak farklı sınıflar içerisinde çalıştırılan birbirinden bağımsız ancak iş kuralı olarak tek iş olan işlemleri tek bir transaction içerisinde çalıştıracağız. Sipariş kayıdı girilirken Siparisler tablosuna kaydedilen sipariş bilgisi ile SiparisDetaylar tablosuna kaydedilen sipariş içerisindeki ürünleri belirleyen kayıtların tek bir transaction içerisinde yer almasını sağlayacağız. Not: Bu senaryoda ki gibi aynı veritabanında bulunan iki tablo üzerinde yapılan işlemler zaten ADO.NET Transaction ile yapılabilir ve o şekilde yapılması performans açısından tavsiye edilmektedir. Ancak burada örneklendirilmek istenen farklı sınıflar içerisinde birbirinden tamamen habersiz olarak gerçekleştirilen ve DTC tarafından yönetilebilen işlerin aynı transactiona dahil edilmesidir. Kendi uygulamalarınız da uzakdaki bir sunucu üzerinde test etmek için sadece connectionstring değiştirerek ve makale sonunda bahsedilen yapılandırmayı yaparak bu işlemi gerçekleştirebilirsiniz.
Yukarıdaki şemaya uygun olarak verilerimizi taşıyacak ve veriler üzerinde CRUD (CREATE, READ, UPDATE, DELETE) işlemlerini gerçekleştirecek olan sınıflarımızı oluşturalım. Burada basitlik açısından sınıf tasarımlarında eksikler vardır. Şuan ki amacımız için gerekli olan özellik ve metodlar dahil edilmiştir.
Musteri sınıfı veritabanındaki müşteri bilgilerini taşımak için gerekli olan sınıftır. Örneğimiz için gerekli olmayan CRUD işlemleri için herhangi bir implementasyon yapılmamıştır.
Yukarıdaki kod bloğun yer alan sınıf bir siparis detay kayıdını temsil eden ve gerekli olan yeni kayıt eklemeyi sağlayan bir metodu (kaydet) içermektedir. Kod bloğu içerisinde yer alan property'lerin standart set ve get bölümleri makale içerisinde kodun sadeliğini sağlaması açısında silinmiştir. Örnek uygulama içerisinde ilgili bölümler tam ve çalışır halde yer almaktadır. Bu sınıf kayıt işlemi için SqlDal Adındaki veri erişim sınıfını kullanmaktadır bu sınıf ile yapılan işlemler yeni bir connection üzerinden yapılmaktadır.
Yukarıdaki kod içerisinde bir siparişi temsil etmek ve yeni bir sipariş kayıdı girebilmeyi sağlayan bir sınıf yer almaktadır. Bu sınıf içerisindeki Kaydet metodu dikkat etmemiz gerek bölümdür. Bu metod içerisinde önce kendi connectionı ile bir sipariş kayıdı girilmekte (INSERT INTO) daha sonra bu siparis nesnesinin SiparisDetaylar collectionı içerisideki tüm siparisdetay sınıflarının kaydet metodu çağrılmaktadır. Ve bütün bu işlemle COM+ servislerinden faydalanabilmek için bir context oluşturulduğu sırada yapıldığı için yapılan tüm bu işlemler bir COM+ transactionı içerisinde yer almaktadır. Yukarıdaki siparis sınıfı test etmek için bir windows form üzerine bir buton ekleyip aşağıdaki kodu yazınız.
Yukarıdaki kodun click olayına yazıldığı butona tıklandığında aşağıdaki resimde gözüktüğü gibi bir COM+ Transactionı başlatılır.
Bu durumda COM+ Transactionı içerisinde yapılan sipariş kayıdı girme, sipariş için birinci sipariş detayını girme, sipariş için ikinci sipariş detayını girme işlemlerin hepsi onaylandığı takdirde işlemler ilgili veri kaynaklarına yansıtılacak aksi halde DTC servisi aracılığı ile işlemler onaylanmadan, geri alınacaktır. Aslında bu örnek uygulama ile .NET Framework 2.0'da gelen ve heyecan uyandıran TransactionScope sınıfın yaptığı işlemin aynısı uygulamış oluyoruz. Bu senaryoda kullanılan yöntemleri farklı konumlardaki veri kaynakları üzerinde çalıştırarak test edebilirsiniz. Örneğin Siparisler ve SiparisDetaylar tabloları farklı SQL Server'lar üzerinde oluşturulup(tamam pek gerçekçi değil:)), connectionstringler düzenlenip aynı işlem test edilebilir ve bu şekilde Distributed Transaction gerçekleştirilmiş olur. Ancak... DTC'nin farklı konumlardaki DTC'ler ile konuşabilmesi için DTC'nin Network Access'e sahip olması gerekir. Bu ayar varsayılan olarak kapalı gelir ve açılması gerekir. Aksi halde DTC'nin "enlist" olurken hata ile karşılaştığını anlatan bir hata mesajı alırsınız. Bunun için; Başlat/Çalıştır'a dcomcnfg yazıp Component Services yönetim aracını açın ve Component Services>Computers>My Computer üzerine sağ tıklayıp Properties seçeneğini seçin. Açılan diyalog penceresinden MSDTC sekmesine geçin, oradan da Security Configuration butonuna tıklayın. DTC'nin network üzerinden işlem yapabilmesini sağlayın.
Yukarıdaki anlatılan adımların Distributed Transaction'a dahil olacak tüm bilgisayarlardaki DTC servisleri için gerçekleştirilmesi gereklidir. Yani hem koordinasyonu sağlayan (coordinating) hemde katılımcı (participating) DTC servileri üzerinde bu işlem gerçekleştirilmelidir. Not: Çalıştığınız işletim sistemine bağlı olarak Security Configuration penceresi farklı bir tasarım ile karşınıza gelebilir. Bu işlem ile ilgili olarak makalenin sonunda yer alan Microsoft Knowledge Base "How To" sunu okumanızı öneririm. Ek kaynak : Windows Server 2003'te ağ DTC erişimi nasıl etkinleştirilir
Uygulamada yer alan diğer
sınıflar :
| |||||||
Yazgelistir.com | |||||||