Makale Özeti

Sanırım önceki göndermemde sorun çıkmış. İlk makale gözükmüyor:) Tekrar gönderelim:) Bu makalede sitemizdeki istisnaları(exception) kayıt altında tutabilemmiz için class library oluşturup bunun için çeşitli sağlayıcılar yazacağız:)

Makale

Merhaba arkadaşlar. 2-3 Makale olmasını düşündüğüm bu yazı dizisinde kendimize bir log yönetici yazacağız..

Peki Neden bu kadar uzun?
Makale basit bir log yakalayıcı değil. İçinde çeşitli sağlayıcılar barındırıyor. Logları txtde tutmak için TxtSaglayici, XMLde tutmak için XML saglayici, Event Logda tutmak için EventLogSaglayici barındırıyor... Makalemizi bitirdikten sonra siz de SQLSaglayici, EPosta saglayici yapabilecek duruma geleceksiniz...

Neler Yapacağız?
Sağlayıcılarımızın tabanını oluşturmak için SaglayiciTaban classı oluşturup sağlayıcılarımızı bunun üzerine kuracağız

Peki sağlayıcılarımızın yollarını özelliklerini nerede tutacağız?
Sağlayıcıyla ilgili bütün bilgileri web.configde kullanacağız

Nasıl kullanılır?
İki çeşit kullanımı var.. Birincisi try catch bloğu içinde logyonetim.log(ex) diyerek, ikincisi logyonetim("HataMEsajımız") diyerek

Sadece bu kadar mı?
Hayır.. Ayrıca logyonetim.log fonksiyonuna NameValueCollection göndererek istediğimiz ekveriyi de kayıt altına alabiliyoruz..

Ne zaman başlıyoruz?
Şimdi :)

 

Öncelikle vs.net beta2 yi açıp proje olarak class library seçiyoruz. Burada kullanacağımız ad bu projeyi başka bir projeye referans olarak koyduğumuzda kullanılacak... Ben bir hata yaptım logcu koydum... Biraz komik oldu... Yazı dizimizin sonunda anlayacaksınız:D

Daha sonra uygulamamızın tabanını oluşturalım...

Imports System

Imports System.Web

Imports System.Collections

Imports System.Collections.Specialized 'Ayarlar bize namevaluecollection olarak geleek onun için

Imports System.Configuration.Provider 'ProviderBase tabanını kullanabilmek için

Imports System.Web.Hosting.HostingEnvironment

 

 

Namespace tehlike.logcu

Public MustInherit Class SaglayiciTaban 'Sınıfımız bir taban olacağı için, başka bir şekilde kullanılmasını önlemek için MustInherit tanımladık..

Inherits ProviderBase 'Kalıtım yoluyla Providerbase i klonluyoruz...

Private boolAcik As Boolean 'Kullanacağımız sağlayıcının açık olup olmama durumunu burada tutacağız

Private strSaglayiciAdi As String 'Sağlayıcı adı burada tutulacak

Private strUygulamaAdi As String 'Uygulama adımız burada tutulacak

Private nvcEkVeriler As NameValueCollection 'Ek verilerimiz burada tutulacak. Aslında pek gerek yok config("xx") diyerek de kullanabilirsiniz... Gerektiğinde kullanın ben kullanmadım

Private boolHata As Boolean 'Hata durumunda sağlayıcının çalışmasını buradan

Private boolUyari As Boolean 'Uyarı durumunda sağlayıcının çalışması buradan

Private boolBasari As Boolean 'Başarı  durumunda sağlayıcının çalışması da buradan ayarlanıyor

Public Property saglayiciadi() As String 'Sağlayıcının adını alabileceğimiz property

Get

    Return strSaglayiciAdi

End Get

Set(ByVal deger As String)

    strSaglayiciAdi = deger

End Set

End Property

Public Property acik() As Boolean 'sağlayıcının çalışıp çalışmayacağını alan property

    Get

        Return boolAcik

   End Get

    Set(ByVal deger As Boolean)

        boolAcik = deger

    End Set

End Property

Public Property uygulamaadi() As String 'Uygulama adını tutan property

Get

Return strUygulamaAdi

End Get

Set(ByVal deger As String)

strUygulamaAdi = deger

End Set

End Property

Public Property Ekveriler() As NameValueCollection 'Ekverielrin tutulacağı property-dediğim gibi ben gerek duymadım. Ama koydum... Sonra işe yaramayacağını düşününce sildim

    Get

        Return nvcEkVeriler

    End Get

    Set(ByVal deger As NameValueCollection)

      nvcEkVeriler = deger

    End Set

End Property

Public Property hata() As Boolean 'hata durumunda çalışıp çalışmaması gerektiği buradan anlaşılacak

    Get

        Return boolHata

    End Get

    Set(ByVal deger As Boolean)

        boolHata = deger

    End Set

End Property

Public Property uyari() As Boolean'uyarı durumunda çalışıp çalışmaması gerektiği buradan anlaşılacak

Get

Return boolUyari

End Get

Set(ByVal deger As Boolean)

boolUyari = deger

End Set

End Property

Public Property basari() As Boolean'basari durumunda çalışıp çalışmaması gerektiği buradan anlaşılacak

    Get

        Return boolBasari

    End Get

    Set(ByVal deger As Boolean)

        boolBasari = deger

    End Set

End Property

Public Overrides Sub Initialize(ByVal ad As String, ByVal config As System.Collections.Specialized.NameValueCollection) 'Initialize olduğunda yani çalıştığında burası devreye girecek

    uygulamaadi = config("uygulama") 'gelen config dosyasından uygulama adını alabiliriz...

    strSaglayiciAdi = ad

    Bolean.TryParse(config("acik"), boolAcik) 'Web.config dosyamizda acik="true" şeklinde görünecek.. Bunu boolean türüne çevirmek için boolean.tryparse("true",ciktidegisken) tarzı kullanabiliriz

    Boolean.TryParse(config("uyari"), boolUyari)

    Boolean.TryParse(config("hata"), boolHata)

    Boolean.TryParse(config("basari"), boolBasari)

    If uygulamaadi = "" Then uygulamaadi = Hosting.HostingEnvironment.ApplicationVirtualPath 'eğer uygulama adı yoksa biz uygulamanın sanal yolunu alıp uygulama adı oalrak atıyoruz

    MyBase.Initialize(ad, config) 'Klonladığımız classın (providerbase in initialize methodunu  işliyoruz)

End Sub

Public MustOverride Sub Log(ByVal except As Exception, Optional ByVal ekveri As NameValueCollection = Nothing) 'Buraları şimdi doldurmuyoruz.. Buralar Sağlayıcılar tanımlarken doldurulacak. MustOverride olarak tanımladığımız methodlar, bu sınıf(class) inherit edildiğinda tekrar tanımlanmak zorundadırlar aksi halde hata alırsınız

Public MustOverride Sub Log(ByVal mesaj As String, Optional ByVal tip As String = "Uyarı", Optional ByVal ekveri As NameValueCollection = Nothing)

End Class

End Namespace

Bu kodları clsSaglayiciTaban.vb olarak kaydedin.

Şimdi web.config dosyasındaki veriyi alabilmemiz için LogYonetimBolumu sınıfımızı oluşturalım

Imports System.Web.Configuration

Imports System.Collections.Generic

Imports System.Text

Imports System.Configuration

Namespace tehlike.logcu

    Public Class LogYonetimBolumu

        Inherits ConfigurationSection'Web.config kullanabileceğimiz sınıfı klonluyoruz

      <ConfigurationProperty("acik")> _ 'Log Yoneticimizin açık olma durumunu tutmak için <ConfigurationProperty("acik")> _ şeklindeki yapıyı property ile beraber kullanmalıyız.. Aksi halde sadece property ile yakalayamayiz değeri

        Public Property acik() As Boolean

            Get

                Return MyBase.Item("acik")

            End Get

            Set(ByVal deger As Boolean)

            MyBase.Item("acik") = deger

            End Set

        End Property

      <ConfigurationProperty("saglayicilar")> _ Sağlayici listemizin olduğu bölümü yakalıyoruz

        Public ReadOnly Property saglayicilar() As ProviderSettingsCollection

            Get

                Return MyBase.Item("saglayicilar")

            End Get

        End Property

        Protected Overrides Sub InitializeDefault()

             MyBase.InitializeDefault()

             Dim saglayiciaciklama As String = ""

        End Sub

    End Class

End Namespace

 

Bu kodları clsLogYonetimBolumu.vb olarak kaydedelim...

 

Biz şimdiye kadar ne yaptık?

Bir çeşit eklenti olarak düşünebileceğimiz bir yapıyı kurduk. Bunun için providerbase i sınıfımıza inherits kullanarak klonladık... .. Ad bizim sağlayıcımızın adı olacak, config de web.config dosyasından gelen ayarlar...

 

Bu yöntemle neler yapabiliriz?

Bizim yaptığımız gibi bir log tutucu yapabilirsiniz veya belli bir sınıfı taban alarak kendi verisağlayıcılarınızı oluşturabilirsiniz... (sql provider vs gibi)

Bize ne kazandırabilir derseniz sadece taban sınıf üzerinde oynama yaparak bütün sınıflarda o değişikliğin olasmını sağlayabilirsiniz(aslında bu klon olayının yaptığı işlev). Daha çok eklenti mimarisini bu şekilde kurmanıza yarar.. İşiniz baya bir kolaylaşacaktır.

 

Tuna TOKSÖZ