AOP – 1

21Nis11

Temelde Aspect Orinted Programming yaklaşımı farklı uygulama seviyelerinde ve/veya farklı sınıflarda ortak amaçla kullanılan loglama, exception handling, tracing gibi enterprise bir yapıda olmazsa olmaz, ancak kod blokları içinde çokça tekrarlanan ve bakımı zorlaştıran katmanların/yapıların bussiness dışına çıkarılmasını amaçlar. Bu iş geliştirilmiş bir çok framework var. En önemlileri PostSharp ve Linfu.AOP. Ancak ben biraz daha detaylı bir inceleme için, frameworklerden birini alıp, nasıl AOP yapılır yazmak yerine, kendimiz nasıl temel prensiplere bağlı bir AOP yapısı geliştirebiliriz onu anlatmaya çalışacağım.

Örneğin

public double Divide(double x, double y)
{
    try
    {
        return x / y;
    }
    catch (DivideByZeroException ex)
    {
        Logger.LogException(ex)
        throw (ex);
    }
}

gibi bir kodumuz var. Burada loglama ve exception handlingi (herzaman olduğu gibi) kodun içinde yapıyoruz.
Ancak AOP yaklaşımı ile bu işi tamamen ilgili  method içinden çıkarabiliyoruz.

ObjectProxy proxy = new ObjectProxy();
proxy.Aspects.After.Add(new LogAdvice());
proxy.Aspects.Error(new ExceptionHandlerAdvice()});
Calculator calc = proxy.Create<Calculater>();
calc.Divide();

Böylelikle bölme işlemi sadece

public double Divide(double x, double y)
{
    return x / y;
}

ile çözümlenebiliyor.

AOP yaklaşımı

  • Cross-cutting concerns (CCC): Uygulama içinde farklı yerlerde ama aynı amaçla kullanılan, loglama, exception handling gibi sınıflardır.
  • Advice : AOP yapısı içinde bir modele uygulanan CCC’lere ilişkin çözüm içeren yapıdır. Yukarıda örneklenen loglama ve exception handling gibi.
  •  Point Cut : Advice’ın uygulanacağı yerdir. Örneğin yukarıdaki yapıda, ilgili threadde methodun çalıştırılıp çıkıldığı noktada bir point-cut noktasıdır.
  • Aspect : Point Cut ve Advice’ın oluşturduğu yapıya da Aspect denir.
  • Waving: Waving ise CCC’leri varolan yapı içine derleyen işlemdir. Waving için farklı yaklaşımlar bulunuyor. Bunlar
    • Compile time weaving: Bu tip waving, .net kodunun MSIL koduna çevrilmesinden hemen önce gerçekleşir. “Aspect Compiler” kodu derler ve native compiler’a yönlendirir. Net native olarak bunu desteklemiyor.
    • Link time weaving: Burada ise, Aspect Compiler, .Net compiler’ın varolan kodu MSIL’e çevirmesinden sonra çalıştırılır.
    • Run time weaving: Burada ise, ana kod ile aop kodları beraber derlenir. Bu .Net ortamında native olarak destekleniyor.
temel kavramlarından oluşuyor. Benim uygulamaya çalıştığım yapı ise, run time waving. Ancak compile time waving ile ilgili de bir örnek ekleyeceğim.
Bu bağlamda öncelikle bu yöntemi uygulayabilmek için tüm nesneleri ContextBoundObject(MarshallByRef) objesinden türetmeliyiz. Bunu interface’ler ile yapmak da mümkün. (bkz. .Net Proxyler). Ancak ben burada daha baasit çabuk olan yöntemi tercih ettim. Nede olsa buradaki amacımız anlamak ve test yapmak.
Kaynaklar : 


No Responses Yet to “AOP – 1”

  1. Yorum yapın

Yorum yapın

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Değiştir )

Twitter picture

You are commenting using your Twitter account. Log Out / Değiştir )

Facebook photo

You are commenting using your Facebook account. Log Out / Değiştir )

Connecting to %s


Takip Et

Get every new post delivered to your Inbox.