Makale Özeti

Merhabalar, bu yazımızda Com+ ın .Net e göre olan üstünlüklerinden birisi olan Loosely Coupled Events (ince bağlı olaylar) tan bahsedeceğiz.

Makale

Com+ da İnce bağlı olaylar (Loosly Coupled Events)

 

Merhabalar, bu yazımızda Com+ ın .Net e göre olan üstünlüklerinden birisi olan Loosely Coupled Events (ince bağlı olaylar) tan bahsedeceğiz.

 

İlk önce bilmeyenler için Com+ Microsoft un Com teknolojisini geliştirdikten sonra MTS teknolojisini Com teknolojisi ile birleştirip Win DNA mimarisinden üretilen bir yapıdır. Win DNA mimarisi .Net çıkmadan önce geliştirilen bir yapıdır. Win DNA nın esas amacı Distributed Application (dağıtık uygulama) geliştirmekti (zaten DNA nın açılımıda Distributed Network Application olarak geçiyor).

 

Olay kavramını biraz inceleyelim. olay bir uygulamanın bir işi yapması ile tetiklenen bir iştir. Öreğin windows da çok sık kullandığımız, butona basılması bir olaydır. Butona basıldığında bu butonun Click olayı tetiklenir ve Click olayına göre bir işlem yapılır. (Windows da olaya dayalı programalama olduğu için her windows yada Asp.Net programcısı olayları kullanmak zorundadır.)

 

İki türlü olay modeli vardır.

Puul model ve push model,

Puul Modeli : pull modelinde bir nesne olayları toplar ve bu topladığı olaylara göre işlemler yapar.

Push Modeli : push modelinde ise her olay oluştuğunda bu olay iletilir. İletilen olaya göre işlemler yapılır.

 

Genellikle bu işlemler bir nesne ve bu nesnenin olaylarını dinleyen bir yapı ile yapılır. Yani bir olayı tetikleyen birde olayı dinleyen (olayı yakalayan) yapıya ihtiyaç vardır.

 

Olayı yakalama mekanizmalarıda bir kaç çeşide ayrılır. Biz .Net Framework’teki ve Com+ daki LCE üstünde duracağız.

 

.Net Framework’teki yapı delegate tabanlı (yetki verme) bir yapıdır (buda aslında temel olarak CallBack tabanlı yapıdır.) yani .Net FW de bir olay oluşur. Bu olay bir olay yakalayıcısı ise yakalanır ve delegate vasıtası ile bu olay ile ilgili olan fonksiyona olayı tetikleyen nesne yönlendirilir (olay fonksiyonlarındaki sender nesnesi gibi).

 

COM+ daki LCE modelinde ise, yayıncılar (Publisher) ve aboneler (Subscriber) den faydalanılır. Veriye ulaşan bileşen (yani yayıncı) ve yayıncının haberi olmadan tetiklenen olay yakalama yapısı üstüne kurulmuştur. Bu şekilde iki bileşende birbirlerini etkilemeden değiştirlebilir ve geliştirilebilir. Bu mimaride tam ortaya yerleştirilecek bir aracı class (Event Class) vasıtası ile yayıncılar ve aboneler birbirlerine bağlanırlar. Bu olay class ı çok basit bir class dır ve içinde temel olarak arayüzler (event interface) barındırır. Yayıncıların ve abonelerin ortak noktaları bu olay classıdır (aslında olay arayüzüdür) bu iki olayı birbirinede COM+ katalogdan Abonelik (subscription) bölümünden bağlayarak oluşturabilirsiniz.

 

 

Şimdi bu işlemlerin adım adım nasıl yapılacağına bakalım.

 

İlk önce yeni bir Windows Uygulaması oluşturun ve adına ComLceWin yazın. Bu olayı tetiklememize yarayacak uygulama. Şimdi Solution Explorer penceresinden Solution a sağ tıklayarak Add -> New Project adımlarını izleyin. Burada ise yeni bir Class Library seçin ve adınada ComLceComp yazın. Bu oluşan Class sayfası bizim aracı classımız yada interfacemiz, bu sayfayı sadece bir interface (Event Interface) yazmak için kullanacağız. Bu yüzden o sayfadaki herşeyi silin (public class Class1 ve End Classı) ve şunları yazın,

 

Public Interface IEvents

    Function metot1() As String

End Interface

 

Daha sonra Class Library mize yeni bir Class File ekleyin. Bunun için Projeye sağ tuş tıklayarak Add -> Add Class tıklayın. Yeni Class dosyasını ekledikten sonra Com+ Nesnemizi yaratmak için gerekli bazı ayarları yapacağız. Örneğin System.EnterpriseServices Assembly Referans larınıza ekleyin. Daha sonra Class dosyasının en başına System.EnterpriseServices ve System.Reflection Namespace lerini import edin. Aşağıdaki kodları yazın.

 

Imports System.EnterpriseServices

Imports System.Reflection

 

<Assembly: AssemblyKeyFile("f:\comp.snk")>

<Assembly: ApplicationName("Com+ LCE")>

<Assembly: Description("LCE ornegi")>

<Assembly: ApplicationActivation(ActivationOption.Server)>

 

Public Class OlayClass

    Inherits ServicedComponent

    Implements IEvents

 

    Public Function metot1() As String Implements IEvents.metot1

 

    End Function

End Class

 

Bu kodlardaki Assembly ile başlayan bölümler tamamen Com+ bileşenimizin yaratılması ile alakalıdır ve bizim konumuz dışındadır ancak ben yinede çok basitçe anlatayım. İlk satır yani AssemblyKeyFile bir Strong Name oluşturmak için gerekli olan Key dosyasının konumunu gösteriyor (sn –k comp.snk komutu ile VS.NET command Prompttan yaratabilirsiniz.) ApplicationName bileşenimizin görüntülenecek ismi, Description bileşenin açıklamasını ApplicationActivation ise bileşenimizin bir server uygulamasımı olduğunu yoksa bir library uygulamasımı olduğunu anlatıyor. Dediğim gibi bu bölümler Com+ nesnesi ile alakalı. Önemli olan bölüm Classın başındaki EventClass deyimi böylece bu Classın Yayıncı olduğunu anlatıyoruz. ServiceComponent Classını inherit az önce oluşturduğumuz IEvents isimli Interfacemizi de implement ediyoruz. Vs.Net otomatik olarak bu interfacedeki Metodu getiriyor. Buradaki metot bir iş yapabilir ama şu anda bu beni ilgilendirmiyor ben o yüzden bu metodu boş bırakıyorum.

 

Son olarak bir Class dosyası daha ekleyin bu dosya ise bizim abonemiz bu abone olay classında tetiklenen metodu yakalayacak ve ona göre bir iş yapacak. Bu class dosyasına aşağıdaki kodları yerleştirin.

 

Imports System.EnterpriseServices

Imports System.Reflection

 

Public Class Abone

    Inherits ServicedComponent

    Implements IEvents

 

    Public Function metot1() As String Implements IEvents.metot1

        MsgBox("Calisti")

    End Function

End Class

 

Yapılan işlemler çok basit ServicedComponentten türetiyorumki Com+ bileşeni olsun sonra benim interfacemi implement ediyorum. Metot yine otomatik olarak geliyor ben sadece MsgBox ile çalıştı metnin görüntülenmesini sağlıyorum.

 

Bileşenlerimiz tamam şimdi sıra geldi bunları kullanmaya. İlk önce oluşturduğumuz windows projesine gelin References klasörüne sağ tuş tıklayın ve Add Reference ye basın, açılacak olan formun en son sekmesine Project sekmesine geçin, demin oluşturduğumuz projeye iki kere tıklayın ve OK a basın daha sonra formun üstüne bir buton yerleştirip Clik lenme olayına şu kodları yazın

 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim srv As ComLceComp.OlayClass = New ComLceComp.OlayClass

        srv.metot1()

    End Sub

Burada ben OlayClass ımdaki Interfaceden gelen metot1 isimli metot u tetikledim.

Şimdi uygulamanızı çalıştırın. Uygulamayı çalıştırmaktaki amacımız Com+ nesnemizin katalogda oluşturulması, ilk kez butona tıkladığımızda sadece nesnemiz katalog a kaydedilecek, kaydedildikten sonra abonelerimizi bağlayacağız.

 

Şimdi çalıştırın ve kataloga kaydedin. Katalog a kaydedilip kaydedilmediğini görmek için başlat çalıştıra dcomcnfg yazın ve entere basın. Şekilden nesnemizin oluşup oluşmadığını görebilirsiniz.

Şimdi ise abonelikleri tanımlayacağız. Abone Classımızdan oluşturulmuş olan ComLceComp.Abone yi genişletin ve Subscriptions klasörüne sağ tuş tıklayarak New den Subscription a tıklayınız, Hoş geldiniz ekranını next ile geçin yeni gelecek formda ise sizin abone olabileceğiniz yapılar listelenecek biz en alttaki IEvents i bulup onu seçeceğiz.

Daha sonra yine next e basın. Gelen diğer formda OlayClassınızı seçip Next e basın, bu ekranda bu aboneliğe bir isim vermenizi istiyor. Ben abonelik yazacağım. İsim verdikten sonra altta bir checkbox var. Bu Checkbox ı check leyin. Eğer checklemezseniz bu abonelik yaratılacak ancak enable olmayacaktır.

En son olarak Finish e basın ve bu ekranı kapatın. Alttaki ekranda oluşturulan aboneliği görüyoruz.

 

Artık projemizi bir kez daha çalıştırmak kaldı geriye. Dikkat etmeniz gereken nokta ben Formda butonun Click lenmesinde OlayClass ını oluşturdum. Ancak bu classdaki metotda hiç bir iş yoktu. Abone Classımda MsgBox vardı. Ben OlayClassımdaki metotu çağaracağım o Aboneliği vasıtasıyla gidip diğer Class daki metotu tetikleyecek.

Böylece Com+ ın çok fazla bilinmeyen ancak .Net e göre bir üstünlüğü olan LCE yi incelemiş olduk. bu projenin kodlarını buradan indirebilirsiniz. Bu makale ile ilgili herhangi bir sorunuz için mailimi kullanabilirsiniz.

 

Levent Cenk Çağlar

cenkc@yazgelistir.com