2012-11-03 23 views
13

Kendi uygulamalarıyla devam etmeden önce hepsinin aynı işlevleri yerine getirmesi gereken çeşitli bireysel yöntemlerim var. Şimdi her bir yöntemde bu işlevleri uygulayabilirim ama bunu yapmak için attributes'u kullanmanın bir yolu olup olmadığını merak ediyordum? Çok basit bir örnek olarak, tüm ağ aramaları bir ağ bağlantısını kontrol etmek zorunda.Arama Yöntemlerine Öznitelikleri Kullanma

public void GetPage(string url) 
{ 
    if(IsNetworkConnected()) 
     ... 
    else 
     ...   
} 

Bu çalışacak, ama ağını kullanan her yöntem için IsNetworkConnected yöntemini çağırın ve ayrı ayrı ele gerekirdi. ağ, bir hata yöntemi yerine denir ve GetPage göz ardı edilir, aksi GetPage çağrılır müsait değilse Bunun yerine, bu

[NetworkCall] 
public void GetPage(string url) 
{ 
    ... 
} 

yapmak istiyorum.

Bu, Aspect Orientated Programming'e çok benziyor, ancak birkaç çağrı için tüm çerçeveyi uygulamak istemiyorum. Bu, bir uygulamadan ziyade bir öğrenme alıştırmasıdır, bu yüzden böyle bir şeyin nasıl en iyi şekilde uygulanacağını merak ettim.

+0

Mirastan ne haber?Hepsinin bir "Network" sınıfı veya onun gibi bir şeyden türetilmiş olmasını sağlayın. – gdoron

cevap

3

Sen PostSharp kullanabilirsiniz, o NET için boy odaklı bir çerçeve, bu quite easy to use görünüyor:

static void Main(string[] args) 
{ 
    Foo(); 
} 

[IgnoreMethod(IsIgnored=true)] 
public static void Foo() 
{ 
    Console.WriteLine("Executing Foo()..."); 
} 

[Serializable] 
public class IgnoreMethodAttribute : PostSharp.Aspects.MethodInterceptionAspect 
{ 
    public bool IsIgnored { get; set; } 

    public override void OnInvoke(PostSharp.Aspects.MethodInterceptionArgs args) 
    { 
     if (IsIgnored) 
     { 
      return; 
     } 

     base.OnInvoke(args); 
    } 
} 

Yöntem Düzey Yönleri özellik serbest baskısında mevcuttur: http://www.sharpcrafters.com/purchase/compare

Çalışma Zamanı Performansı:

PostSh arp bir derleyici teknolojisidir, pahalı işlerin çoğu yapım aşamasında yapılır, böylece uygulamalar hızlı bir şekilde başlar ve hızlı bir şekilde yürütülür. Kod oluştururken, PostSharp sanal bir yöntem çağırmanın veya statik alan almanın pahalı bir işlem olduğu varsayımını alır. Söylentinin aksine, PostSharp çalışma zamanında System.Reflection kullanmaz. http://www.sharpcrafters.com/postsharp/performance

+0

PostSharp'ın verimsiz bir katmandan geçmesi gerektiği için verimsiz olacağını düşündüm ... ama bu * sesler * gibi çoğu şey derleme zamanında. Güzel, temiz API. Bazı projelerim için bunu deneyebilirim. – mpen

+0

Evet, sadece kendi web sitesinde okuyoruz: '' Söylentinin aksine PostSharp, çalışma zamanında System.Reflection'ı kullanmaz. '' http://www.sharpcrafters.com/postsharp/performance Yani, performans yok' Bir sorun gibi görünüyor. – maximpa

+0

Teşekkürler, PostSharp'a bakacağım. Özellikle bir çerçeve kullanmak istemedim, ama bir alternatif var gibi görünmüyor. – keyboardP

1

Bunu yalnızca attributes ile yapabileceğinizi sanmıyorum, çünkü etkin bir şekilde onlarla bir şey yapmıyorsanız çalışma zamanı tarafından çalıştırılmazlar. Hafif bir yaklaşım Ninject with Interceptions extension olacaktır, bu bir çerçeve, ancak çok zayıf ve zaten DI için zaten kullanıyor olabilirsiniz.

Başka bir seçenek, ancak biraz daha fazla ilgili, MEF dayanabilir ve sonra etkinleştirme sırasında öznitelikleri kullanabilir ve onlarla bir şeyler yapabilirsiniz.

1

Haklısınız, AOP'ye çok benziyor.
Derleme zamanı dokuması gibi seslerin peşinde ne var? Yani özelik derleyici tarafından ek kod haline getirilir. Bunu nasıl uygulanacağına bakmak olabilir
... Generating additional code through a custom attribute
http://www.cs.columbia.edu/~eaddy/wicca/ &
http://www.sharpcrafters.com/aop.net/compiletime-weaving

tüm araçları ve bu iş için teknikler bakın. Veya AOP çerçevesi kullanabilirsiniz. IMHO, AOP çerçevelerine bakmalısın.

İlgili konular