2012-11-03 15 views
13

Mam różne metody, które wszystkie muszą wykonywać te same funkcje, zanim będą kontynuowane we własnej implementacji. Teraz mogłem zaimplementować te funkcje w każdej metodzie, ale zastanawiałem się, czy istnieje sposób na wykorzystanie tego, aby to zrobić? Jako bardzo prosty przykład, wszystkie połączenia sieciowe muszą sprawdzić połączenie sieciowe.Używanie atrybutów do metod wywoływania

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

to będzie działać, ale będę musiał wywołać metodę IsNetworkConnected dla każdej metody, która korzysta z sieci i obsługiwać go indywidualnie. Zamiast tego chciałbym zrobić to

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

Jeśli sieć nie jest dostępna, metoda nazywa się błąd i zamiast GetPage jest ignorowany, inaczej GetPage jest wywoływany.

To brzmi bardzo podobnie do programowania zorientowanego na aspekt, ale nie chcę zaimplementować całej struktury dla kilku wywołań. Jest to raczej ćwiczenie edukacyjne niż implementacyjne, więc byłem ciekawy, jak najlepiej byłoby coś takiego.

+0

Co z dziedziczeniem?Niech wszyscy wywodzą się z podstawowej klasy "Sieć" lub czegoś podobnego. – gdoron

Odpowiedz

3

Można użyć PostSharp jest aspekt zorientowane ramy .NET wydaje 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); 
    } 
} 

Metoda poziomu Aspekty funkcja jest dostępna w darmo edycji: http://www.sharpcrafters.com/purchase/compare

Wydajność:

Wydajność:

Ponieważ PostSh Arp jest technologią kompilatora, większość kosztownej pracy jest wykonywana w czasie kompilacji, dzięki czemu aplikacje szybko się uruchamiają i działają szybko. Podczas generowania kodu PostSharp przyjmuje założenie, że wywołanie metody wirtualnej lub uzyskanie statycznego pola jest kosztowną operacją. W przeciwieństwie do plotek PostSharp nie używa System.Reflection w czasie wykonywania. http://www.sharpcrafters.com/postsharp/performance

+0

Myślałem, że PostSharp będzie nieefektywny, ponieważ musi przejść przez warstwę refleksji ... ale to * brzmi * tak, jakby większość rzeczy była w kompilacji. Ładne, czyste API. Mogę spróbować tego w przypadku niektórych moich projektów. – mpen

+0

Tak, właśnie przeczytałem na ich stronie internetowej: '" W przeciwieństwie do plotek, PostSharp nie używa System.Reflection w czasie wykonywania. "' http://www.sharpcrafters.com/postsharp/performance A więc, wydajność nie " wydaje się być problemem. – maximpa

+0

Dzięki, zajrzę do PostSharp. Nie chciałem szczególnie używać frameworka, ale wydaje mi się, że nie ma alternatywy. – keyboardP

1

Nie sądzę, że można to zrobić tylko z attributes, ponieważ nie są one wykonywane przez środowisko wykonawcze, jeśli nie aktywnie robisz z nimi coś. Lekkie podejście to Ninject with Interceptions extension, jest to framework, ale bardzo cienki i jeden, który i tak możesz już używać dla DI.

Inna opcja, ale nieco bardziej zaangażowana, może być oparta na MEF, a następnie można użyć atrybutów i zrobić coś podczas nich podczas aktywacji.

1

Masz rację, to brzmi trochę jak AOP.
Co masz na myśli brzmi jak tkanie czasu kompilacji? To znaczy. atrybut jest zamieniany na dodatkowy kod przez kompilator.
Można zastanowić się, jak zaimplementować to ...
Generating additional code through a custom attribute
http://www.cs.columbia.edu/~eaddy/wicca/ &
http://www.sharpcrafters.com/aop.net/compiletime-weaving
wszystkie odnoszą się do narzędzi i technik, jak to zrobić.

Lub możesz użyć ramy AOP. IMHO, powinieneś przyjrzeć się ramom AOP.

Powiązane problemy