2012-11-03 22 views
13

Ich habe verschiedene individuelle Methoden, die alle die gleichen Funktionen ausführen müssen, bevor Sie mit einer eigenen Implementierung fortfahren. Jetzt könnte ich diese Funktionen in jeder Methode implementieren, aber ich frage mich, ob es eine Möglichkeit gibt, attributes auszunutzen, um dies zu tun? Als ein sehr einfaches Beispiel müssen alle Netzwerkverbindungen nach einer Netzwerkverbindung suchen.Verwenden von Attributen zum Aufrufen von Methoden

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

Dies funktionieren würde, aber ich würde die IsNetworkConnected Methode für jede Methode aufrufen, die das Netzwerk verwendet und individuell zu behandeln. Stattdessen würde Ich mag diesen

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

tun, wenn das Netzwerk nicht verfügbar ist, wird eine Fehler-Methode aufgerufen, statt und GetPage wird ignoriert, andernfalls wird GetPage aufgerufen.

Das klingt sehr nach Aspect Orientated Programming, aber ich möchte nicht ein ganzes Framework für ein paar Anrufe implementieren. Dies ist mehr eine Lernübung als eine Implementierung, also war ich neugierig, wie so etwas am besten umgesetzt werden könnte.

+0

Was ist mit Vererbung?Machen Sie alle von einer Basis "Netzwerk" -Klasse oder etwas ähnliches ableiten. – gdoron

Antwort

3

Sie können PostSharp verwenden, ist es aspektorientiertes Framework für .NET, so scheint es quite easy to use:

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); 
    } 
} 

Method-Level-Aspekte Funktion ist in der kostenlos Ausgabe: http://www.sharpcrafters.com/purchase/compare

Laufzeit Leistung:

Weil PostSh arp ist eine Compiler-Technologie, die meiste teuere Arbeit wird zur Build-Zeit erledigt, so dass Anwendungen schnell starten und schnell ausgeführt werden können. Beim Erstellen von Code geht PostSharp davon aus, dass das Aufrufen einer virtuellen Methode oder das Abrufen eines statischen Felds eine kostspielige Operation ist. Im Gegensatz zum Gerücht verwendet PostSharp zur Laufzeit keine System.Reflection. http://www.sharpcrafters.com/postsharp/performance

+0

Ich dachte, PostSharp wäre ineffizient, weil es eine Reflexionsschicht durchläuft ... aber es * klingt * so, als ob es die meisten Sachen zur Kompilierzeit macht. Nette, saubere API. Ich könnte dies für einige meiner Projekte ausprobieren. – mpen

+0

Ja, habe gerade auf ihrer Website gelesen: '" Im Gegensatz zu Gerüchten, PostSharp verwendet System.Reflection zur Laufzeit nicht. "' http://www.sharpcrafters.com/postsharp/performance So, die Leistung doesn ' Das scheint ein Problem zu sein. – maximpa

+0

Danke, ich werde in PostSharp schauen. Ich wollte nicht unbedingt einen Rahmen verwenden, aber es scheint keine Alternative zu geben. – keyboardP

1

Ich glaube nicht, dass Sie dies mit attributes nur tun können, weil sie nicht von der Laufzeit ausgeführt werden, wenn Sie nicht aktiv etwas mit ihnen tun. Ein leichtgewichtiger Ansatz wäre Ninject with Interceptions extension, es ist ein Framework, aber ein sehr dünnes, und eines, das Sie ohnehin für DI sowieso verwenden.

Eine andere Option, aber ein bisschen mehr beteiligt, könnte auf MEF basieren, und dann können Sie Attribute verwenden und während der Aktivierung etwas mit ihnen tun.

1

Sie haben recht, es klingt sehr nach AOP.
Was Sie suchen, klingt wie Kompilieren Weben? I.e. Das Attribut wird vom Compiler in zusätzlichen Code umgewandelt.
Sie sehen könnte, wie dies umzusetzen ...
Generating additional code through a custom attribute
http://www.cs.columbia.edu/~eaddy/wicca/ &
http://www.sharpcrafters.com/aop.net/compiletime-weaving
beziehen sich alle auf Werkzeuge und Techniken, dies zu tun.

Oder Sie könnten ein AOP-Framework verwenden. IMHO sollten Sie AOP-Frameworks betrachten.

Verwandte Themen