fbpx

Jak wywołać metodę C# za pomocą Aspect Oriented Programming i biblioteki PostSharp

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#:

  1. Zainstaluj pakiet NuGet PostSharp: W Visual Studio otwórz okno „Package Manager Console” i wpisz następujące polecenie: Install-Package PostSharp.
  2. Stwórz aspekt: Zdefiniuj klasę, która dziedziczy po bazowej klasie OnMethodBoundaryAspect, a następnie zaimplementuj odpowiednie metody, takie jak OnEntry, OnExit czy OnException. 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.
  3. Przypisz aspekt do metody lub klasy: Dodaj atrybut do metody lub klasy, używając nazwy zdefiniowanej klasy aspektu. Na przykład: [MyAspect].
  4. 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.

  1. 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!

0 0 votes
Article Rating
Subscribe
Powiadom o
guest

0 komentarzy
najstarszy
najnowszy oceniany
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
Buduj inteligentne aplikacje w C# z darmową biblioteką NGPT
3-DNIOWE SZKOLENIE Z PODSTAW TECHNOLOGII .NET, C# i SQL