Jako programista .NET, na pewno spotkałeś się z sytuacją, kiedy musisz wykonać fragment kodu na początku każdej metody publicznej. Dobrym przykładem jest zapisywanie czegoś w logach w każdej akcji kontrolera. W takiej sytuacji wywołamy metodę prywatną. Ale istnieje inne, trochę ciekawsze podejście – Aspect Oriented Programming (AOP), które pomaga w rozwiązaniu problemów związanych z modularyzacją i organizacją kodu. W artykule opiszemy, czym jest AOP, jak wykorzystać bibliotekę PostSharp, oraz kto może korzystać z darmowej licencji na korzystanie z tego płatnego narzędzia.
Czym jest Aspect Oriented Programming?
Aspect Oriented Programming (AOP) to paradygmat programowania, który ma na celu zwiększenie modularyzacji kodu poprzez separację interesów (concerns) w różnych aspektach aplikacji. W tradycyjnym podejściu, takim jak Object Oriented Programming (OOP), funkcje związane z pewnym interesem mogą być rozproszone w wielu klasach i modułach. AOP pozwala na wyodrębnienie tych funkcji i umieszczenie ich w oddzielnych jednostkach, zwanych aspektami, co prowadzi do większej czytelności, prostszego utrzymania i łatwiejszego testowania kodu.
PostSharp i jego zastosowanie w C#
PostSharp to popularna biblioteka dla .NET, która pozwala na wdrożenie AOP w języku C#. Umożliwia ona tworzenie aspektów, które będą „dołączane” do odpowiednich części kodu za pomocą atrybutów. Dzięki temu kod staje się czystszy, a funkcje związane z poszczególnymi interesami są wyraźnie oddzielone.
PostSharp jest stosunkowo łatwy w użyciu, a integracja z istniejącymi projektami jest prosta. Oto kilka kroków, które należy wykonać, aby zacząć korzystać z PostSharp w projekcie C#:
- Zainstaluj pakiet NuGet PostSharp: W Visual Studio otwórz okno „Package Manager Console” i wpisz następujące polecenie:
Install-Package PostSharp
. - Stwórz aspekt: Zdefiniuj klasę, która dziedziczy po bazowej klasie
OnMethodBoundaryAspect
, a następnie zaimplementuj odpowiednie metody, takie jakOnEntry
,OnExit
czyOnException
. Ja użuwam metody OnEntry, aby wykonać jakiś kod przed każdą metodą (lub właściwością, bo właściwość to takie połączenie pól i metod) w klasie. - Przypisz aspekt do metody lub klasy: Dodaj atrybut do metody lub klasy, używając nazwy zdefiniowanej klasy aspektu. Na przykład:
[MyAspect]
. - Kompiluj i uruchom projekt: PostSharp zautomatyzuje proces „tkania” aspektów z kodem źródłowym podczas kompilacji.
Przykład
W poniższym przykładzie przedstawiam kod w C#, który wykorzystuje bibliotekę PostSharp do wywołania metody prywatnej przed każdą metodą publiczną w klasie. Stworzymy aspekt, który wykonuje tę operację, a następnie zastosujemy go do klasy, aby osiągnąć żądane działanie.
- Zainstaluj pakiet PostSharp używając Package Manager Console w Visual Studio:
Install-Package PostSharp
2. Stwórz klasę aspektu . Nazwijmy ją: InvokePrivateMethodAspect
using System;
using System.Reflection;
using PostSharp.Aspects;
public class InvokePrivateMethodAspect : OnMethodBoundaryAspect
{
private string _privateMethodName;
public InvokePrivateMethodAspect(string privateMethodName)
{
_privateMethodName = privateMethodName;
}
public override void OnEntry(MethodExecutionArgs args)
{
MethodInfo privateMethod = args.Instance.GetType().GetMethod(_privateMethodName, BindingFlags.NonPublic | BindingFlags.Instance);
if (privateMethod != null)
{
privateMethod.Invoke(args.Instance, null);
}
else
{
throw new InvalidOperationException($"Metoda {_privateMethodName} nie istnieje w klasie.");
}
base.OnEntry(args);
}
}
Następnie w swoim kodzie możesz oznaczyć klasę za pomocą atrybutu. Dzięki temu przed każdą metodą zostanie wywołana wskazana metoda prywatna. Nie musimy wywoływać metod prywatnej ręcznie.
[InvokePrivateMethodAspect("LogActivity")]
public class ExperimentManager
{
public void CreateExperiment()
{
Console.WriteLine("Metoda publiczna Create experiment została wywołana");
}
public void RemoveExperiment()
{
Console.WriteLine("Metoda publiczna - Remove Experiment zostala wywołana");
}
private void LogActivity()
{
Console.WriteLine("Właśnie została wywołana jakaś metoda publiczna.");
}
}
Gdy uruchomisz program, zobaczysz, że metoda prywatna LogActivity
jest wywoływana przed każdą metodą publiczną w Twojej klasie.
Kto może skorzystać z darmowej wersji?
Darmowa wersja nazywa się PostSharp [Essentials] i jest dostępna w projektach do 1000 linii kodu, a więc do doskonale nadaje się do nauki. W przypadku większych projektów, będzie to kosztowało od 150 Euro do 600 Euro, w zależności od wersji narzędzia. Cennik znajdziemy na stronie https://www.postsharp.net/pricing. Ale jest to płatne narzędzie i myślę, że to może być przeszkoda dla wielu firm. Niektóre z nich nie chcą płacić za oprogramowanie, które może zaoszczędzić programistom sporo pracy. A Ty jakich narzędzie AOP używałeś? Zostaw komentarz poniżej. Dzięki!