Yani uygulandığı yerlerden birisi olan Loglama işlemi üzerinden örnekle açıklamak gerekirse durum şu şekildedir.Şimdi diyelim ki süper bir uygulama yazdınız ve bütün oluşan hataları,yapılan işlemleri kayıt altında tutuyorsunuz.Bu kayıtlarınızı da veri tabanınızda tutuyorsunuz.Süper çalışıyor.Yani kuş uçsa bile kayıt altına alıyor uygulamanız :) Fakat diyelim ki kayıt altına aldığınız yerle bağlantınız koptu ve ya bir şekilde loglama kodlarınızda bir hata oluştu.Eee şimdi ne olacak ? Bütün uçan kuşları kayıt altına alıyordunuz.Veri tabanına bağlantıyı sağlayamadınız.Çat yapılan işlem loglanmadı , oluşan hata loglanmadı... Diyelim ki finansal bir uygulamanız olsun.Bu şekilde sorun oldu. Ve bir kullanıcı binlerce dolarlık işlem yaparken hata oluştu.Sorumlusu kim siz :) Peki bu sorunu nasıl çözeceksiniz.Tabi ki birden fazla loglama şekli oluşturacaksınız.
Normalde bu anlatacağım tasarım modelini bilmiyorsanız bir sürü if ler veya switch case lerle boğuşursunuz.Diyelim ki tüm loglama işlemleri değişti.Hayde en baştan kontrol et de yaz da falan filan... Fakat eğer CoR tasarım modelini biliyorsanız, modelinizi oluşturursunuz ve rahat rahat kullanırsınız.İşte giriş kısmında bahsettiğim sorumluluk loglama işlemine ve zincirler de farklı loglama yollarına karşılık gelmiştir.Faydalarını, çalışma mantığını ve kullanıldığı yerleri anladıysak gelelim anlattığım loglama CoR modelimizi oluşturmaya ...
Not : Uygulamayı console uygulaması olarak yazacağım arkadaşlar.Siz istediğiniz gibi geliştirebilirsiniz.
Öncelikle CoR modelinde bulunacak zincirlerin birbirlerine istek gönderebilecekleri yani aralarında anlaşabilecekleri bir interface yazıyoruz arkadaşlar.
interface ILogger
{
ILogger successor { get;
set; }
void Logla(string
hata);
}
Aslında işlemimiz bu kadar . :) Şimdi ise o zincirleri yani nesnelerin classlarını oluşturmaya geldi sıra.Öncelikle database e loglama işlemi yapacak nesnemizi oluşturalım ...
class DbLoglayici
: ILogger
{
#region
ILogger Members
public ILogger
successor { get; set;
}
public void Logla(string hata)
{
int a = 10, b = 0;
try
{
int sonuc = a / b;
Console.WriteLine("{0} hatası Database'e kaydedildi.",
hata);
}
catch (Exception)
{
if
(successor!=null)
{
successor.Logla(hata);
}
}
}
#endregion
}
class TextDosyaLoglayici:ILogger
{
#region
ILogger Members
public ILogger
successor { get; set;
}
public void Logla(string hata)
{
int a = 10, b = 0;
try
{
int sonuc = a / 2;
Console.WriteLine("{0} hatası Text Dosyaya kaydedildi.",hata
);
}
catch (Exception)
{
if (successor != null)
{
successor.Logla(hata);
}
}
}
#endregion
}
class EventLoglayici : ILogger
{
#region
ILogger Members
public ILogger
successor { get; set;
}
public void Logla(string hata)
{
int a = 10, b = 0;
try
{
int sonuc = a / b;
Console.WriteLine("{0} hatası Event Loglara kaydedildi.",
hata);
}
catch (Exception)
{
Console.WriteLine("Hata Loglanamadı");
}
}
#endregion
}
DbLoglayici dbLoglayici = new
DbLoglayici();
TextDosyaLoglayici textDosyaLoglayici = new TextDosyaLoglayici();
EventLoglayici eventLoglayici = new EventLoglayici();
dbLoglayici.successor = textDosyaLoglayici;
textDosyaLoglayici.successor = eventLoglayici;
dbLoglayici.Logla("Failed by user");
Console.ReadLine();
Hiç yorum yok:
Yorum Gönder