![]() | |||||||
COM+ Component'i oluşturmadan COM+ Servislerinden Faydalanmak | 27.05.2005 16:05:00 | ||||||
| Kategori : .NET Framework Özet : COM+ hizmetlerinden faydalanabilmek için bu işlemleri (servicedcomponent'den miras, strong named assembly, com+ kataloğuna kayıt) yapmak zorunda değiliz. COM+ 1.5 sürümünün yüklü olduğu bir işletim sistemin (Windows 2003,XP) COM+ Component'i oluşturmadan COM+ servislerinden faydalanabilirsiniz. | |||||||
COM+ Component'i oluşturmadan COM+ Servislerinden Faydalanmak Hedef Kitle : Temel seviyede COM+ bilgisi olan
uygulama geliştiriciler. COM+ Component'i olarak çalışmasını istediğimiz sınıflarımız için uygumamız gereken kurallar vardır. Örneğin,
Yukarıda gözükmekte olan kod parçasında System.EnterpriseServices.ServicedComponent sınıfından miras (inheritance) alan bir sınıf tanımlaması gözükmektedir. Transaction ve JustInTimeActivation etiketleri ile component içerisinde transactional işlemler yapılacağı ve done biti True olduğunda nesnenin yok edilebileceği (object pooling aktif olsaydı, havuza döneceği belirleniyor) belirleniyor. (Not : Bu konular ile ilgili giriş niteliğindeki makaleleri yine sitemizde bulabilirsiniz.) COM+ Component'i olarak belirlemek istediğimiz sınıfların ServicedComponent sınıfından miras alması zorunludur. Ayrıca bu sınıfın yer aldığı Assembly'nin Strong Named bir assembly olması gereklidir. Başka sınıftan miras almasının zorunlu olması, strong named olması zorunluluğu gibi durumlara bakıldığında COM+ Component'i geliştirmek biraz daha zahmetlidir. COM+ Servislerinden faydalanabilmek için bu işlemleri gerçekleştirip, COM+ Component'imizi COM+ kataloğuna kaydederek kullanırız. COM+ 1.5 COM+ Component'i Oluşturmadan Com+ Servislerinden Faydalanmak (Services Without Components) COM+ hizmetlerinden faydalanabilmek için bu işlemleri (servicedcomponent'den miras, strong named assembly, com+ kataloğuna kayıt) yapmak zorunda değiliz. Eğer uygulamınızın çalıştığı işletim sistemi yukarıda bahsettiğim gibi COM+ 1.5 sürümüne sahip ise COM+ Component'i oluşturmadan COM+ servislerinden faydalanabilirsiniz. Aklımıza hemen ne geldi? Distributed Transactions!! COM+ Componenti olmadan COM+ Transaction'a dahil olmak Minik örneğimiz için bir Windows Application projesi açıp, içerisine Ornek1 adında bir class dosyası ekledikten sonra, System.EnterpriseServices.dll assembly dosyasını projemize referans olarak ekledikten sonra System.EnterpriseServices namespace'ini projemize import edelim.
ServiceConfig
sınıfı TrackingEnabled
: Bu özellik Component Services aracı (dcomcnfg) ile çalışan uygulamanın
izlenip izlenmeyeceğini belirler. Bu özelliği değiştirmek zorunda değiliz. Bu
özelliği değiştirerek uygulamayı Component Services aracı ile izlemek
istediğimiz için bu senaryoda özelliğe True değerini verdik. Ayrıca TrackingAppName, TrackingComponentName, TransactionTimeout gibi özellikler ile uygulamamızın başlatacağı context ile ilgili ayarlamalar yapılabilmektedir. ServiceDomain sınıfı ile serviceconfig ile belirlenmiş olan yapılandırmaya göre uygulama COM+ servislerinden faydalanmaya başlar ve bitirebilir. ServiceDomain.Enter(cfg as ServiceConfig) ile context başlatılır. ServiceDomain.Leave() ile sonlandırılır. Yukarıda oluşturduğumuz sınıfı test etmek için windows formu üzerine bir buton ekleyip aşağıdaki kodu yazalım.
Yukarıdaki örnekte transactional herhangi bir işlem gerçekleştirmeden uygulamamızı transaction içerisine dahil edebiliyor olduğumuzun testini gerçekleştirdik. Resource üzerinde COM+ Transaction yönetiminin sağlanması COM+ Transaction servisleri DTC (Distributed Transaction Coordinator) servisilerini kullanırlar. Fiziksel katmanda DTC'nin Two Phase Commit yönetimi sayesinde COM+ ile Distributed Transaction işlemleri gerçekleştirilebilir. Şimdi COM+ Component'i oluşturmadan bir COM+ Servislerinden gerçekten faydalanan örnek bir uygulama gerçekleştirelim.
Yukarıdaki kodları inceleyelim, basit bir ADO.NET kodu. Birbirinden bağımsız iki SqlConnection nesnesi oluşturulup aynı DB üzerinde farklı kişilerin isimleri değiştiriliyor. Gayet basit! Senaryo icabı ikiside aynı bilgisayardaki aynı veritabanını kullanan iki ayrı kod bloğu. Farklı bilgisayarlardaki veritabanlarını Distributed Transaction'a alma işlemini ve gerekli prosedürleri bir sonraki makalemizde inceleyeceğiz. Yukarıdaki kod parçasına göre şunu isteseydim. "Yapılan iki güncelleme işi bir bütün olsun. İki iş parçacığı bir tek bir parça olarak çalışsın." Daha basit deyimle "Ya ikisi de başarılı olarak çalıştırılsın. Ya da hiç birisi." yani işlerden birisi yapılırken hata olması ve iptal edilmesi, bütün işi iptal edilmesini sağlasın. (Unutmadan örnek kodlarımız aynı veritabanını gösterse de senaryo itibariyle bunların farklı bilgisayarlardaki veritabanı sistemleri olduğunu varsayıyoruz.) Bunun için yapmamız gereken işlem; DTC'yi devreye almak. COM+ Transaction hizmetlerinden faydalanmak. Aşağıdaki örnek kod parçası ile ServiceConfig ve ServiceDomain sınıfları kullanılarak gerekli alt yapı oluşturulup ve uygulamamız COM+ hizmetlerinden faydanabileceği bir context'e sahip olduktan sonra bu arada (Enter ve Leave) standart ADO.NET kodları ile DTC'nin resource olarak kullanabildiği SQL Server üzerinde işlemler yapılmıştır. Aktif context içerisinde yapılan işlemler (sql server ve msmq işlemleri gibi) DTC tarafından kontrol altına alınırlar. Bir COM+ transaction'ı içerisine dahil olurlar.
COM+ Transaction'ının durumunu (tutarlı?) belirlemek için ContextUtil.SetComplete (done=true,consistent=true) veya ContextUtil.SetAbort (done=true,consistent=false) metodları ile işlem başarılı yada başarısız biçimde sonlandırılıyor. Yukarıdaki sınıfı test etmek için windows formu üzerine ikinci bir buton ekleyin ve aşağıdaki kodu yazın.
Yukarıdaki kodu test ettiğinizde işlem başarılı olarak yapıldığında her iki kayıdında güncellendiğini göreceksiniz. COM+ Transaction'ının devrede olduğunu anlayabilmek için bir hata oluşturmanız uygun olacaktır. Örneğin FirstName sütununa (nvarchar(10) olduğu için) 10 karakterden uzun bir değer vererek bir hata oluşmasını sağlayabilirsiniz. Bu durumda yapılan iki iş parçacığından birisinde hata olduğu için bütün iş (iki iş parçacığı da) iptal edilecek, onaylanmayacaktır. "COM+ Component'i oluşturmadan COM+ Servislerinden Faydalanmak" (Services Without Components) başlıklı makalemiz ile COM+ servislerinden faydalanmak için kullanılabileceğimiz alternatif ve pratik bir yöntemden bahsettik. Ve bu güzel özelliğin kullanımı örneklendirdik. Bu konu üzerine sonraki makalemizde, daha object oriented bir yapı ile ufak örnekler gerçekleştirip, transaction yönetiminin gerçekten "distributed" yapılmasını örneklendireceğiz. Örnek Uygulama
| |||||||
Yazgelistir.com | |||||||