Tags: , , , | Posted by Admin on 7/14/2011 10:18 PM | Comments (1)

Uzunca bir aradan sonra merhabalar! Son günlerde AOP tarafına merak sarmamla beraber bu konu başka yazıları da paylaşmak istediğimi söyleyerek yazıya başlıyorum. 


Bilindiği üzere AOP ile kodlama maliyeti düşük kabiliyetli işler yapılabiliyor. Bunların başında loglama, ön bellekleme, yetkilendime gibi konular için geliştirilmiş çözümler yer almakta ve bu da başka bir yazının konusunu oluşturmaktadır. Bu yazıca en basit hali ile durağan bir assembly dosyasının nasıl modifiye edebileceği hakkında bir kaç örnek göstermek istiyorum.

Senaryomuz şöyle olabilir mesela, öyle bir uygulamamız var ki kullanılan her metotun içinde o metotun kullanılma zamanını ve adını(detaylandırmadan) bir yere mutlaka kaydetmemiz gerekiyor olsun. Bu durumda her metotun içerisine metotun kullanımı ile alakalı kayıtı yazdıran kodları tanımlamamız gerekecektir. En iyi ihtimal ile basit bir sınıf yazıp statik bir metot ile kayıt yapan kodu ufaltırız ancak yine her metotun içerisini ayrı ayrı tanımlamamız gerekir. İşte tam bu noktada AOP devreye giriyor.

Aop olmadan yazılan kod örneği:

namespace Mono
{
    class Program
    {
        static void Main(string[] args)
        {
            Metot1();
            Metot2();
            Metot3();
        }

        private static void Metot3()
        {
            // Kayıt yap
            // ***Kod bloğu***
        }

        private static void Metot2()
        {
            // Kayıt yap
            // ***Kod bloğu***
        }

        private static void Metot1()
        {
            // Kayıt yap
            // ***Kod bloğu***
        }
    }
}

 

İkinci örnek olarak da metotun çağırıldığı yerlere kayıt etme kodunu tanımlamak olabilir;

 

namespace Mono
{
    class Program
    {
        static void Main(string[] args)
        {
            Metot1();
            // Kayıt yap(Metot1 çağırıldı)
            
            Metot2();
            // Kayıt yap(Metot2 çağırıldı)

            Metot3();
            // Kayıt yap(Metot3 çağırıldı)
        }

        private static void Metot3()
        {
            // ***Kod bloğu***
        }

        private static void Metot2()
        {
            // ***Kod bloğu***
        }

        private static void Metot1()
        {
            // ***Kod bloğu***
        }
    }
}

 


Ne düşünüyorsunuz? Simon diyorki bu işe toptan bir çözüm üret ve koda bulaştırma. Bu konu hakkındaki ilk yazım olması itibariyle daha fazla detaylandırmadan bu işi nasıl çözebileceğimiz konusunda devam etmek istiyorum.

Sorun hakkında yeterli bilgi verdiğimi düşünüyorum şimdi sıra çözüm yollarından bahsetmeye geldi.

İki temel yöntem karşımıza çıkıyor bunlar; Herhangi bir metotu çağırmak için ara bir metot(dynamic method proxy) kullanma veya kod enjeksiyonu ile metot gövdesi modifiye etmedir. Tabiki benzer durum yalnızca metotlar için değil özellikler,  yapıcı/yıkıcı metotlar vb. yapılar içinde kullanılabilir.

AOP için geliştirilmiş bir çok framework bulunmaktadır. .NET tafarında PostSharp, Castle.DynamicProxy, Linfu.AOP, Ninject, Unity ve Mono.Cecil gibi kütüphaneleri öne çıkanlar arasındadır. Hemen hepsinde bir sınıfa ait metot, özellik gibi nesnelerin hepsinin yada istediğimiz bir kısımının kayıt altına alınması(loglama  senaryomuza göre) için ilgili yapı üzerine küçük bir kod parçası yazılması yeterli olabiliyor. Şöyleki;

 

namespace Mono
{
    [HerseyiKayitAltinaAl]
    class Program
    {
        static void Main(string[] args)
        {
            Metot1();
            Metot2();
            Metot3();
        }

        private static void Metot3()
        {
            // ***Kod bloğu***
        }

        private static void Metot2()
        {
            // ***Kod bloğu***
        }

        private static void Metot1()
        {
            // ***Kod bloğu***
        }
    }
}

 

Böylekikle kod olabildiğince temiz bir şekilde kendi görevinden başka bir şey bilmeden geliştirilmeye devam ederken arka planda öyle ya da böyle bir şekilde bizim için her bir yapıyı elden geçiriyor. Bu yazının istemeden de olsa konu bütünlüğünü korumak ve seviyeyi bozmamak adına burada sonuna geliyorum. Aop konusunda daha ileri seviye yazılarla görüşmek üzere...

Kahve ısmarlayın

Aşağıdaki kahve simgesine tıklayarak bana paypal üzerinden kahve ısmarlayabilirsiniz. Kahveye olan düşkünlüğü ile bilinen birisi olarak büyük bir zevkle içeceğimden emin olabilirsiniz.


Comments (1) -

Ahmet ŞAHİN
Ahmet ŞAHİN Turkey on 8/11/2011 1:03 PM Hocam bunun devamınıda bekliyoruz.

Add comment




biuquote
Loading