Jak programować przy użyciu PostSharp w C #

Programowanie zorientowane na aspekty (AOP) to paradygmat programowania, który umożliwia definiowanie polityk w celu bezproblemowego zarządzania przekrojowymi problemami w aplikacjach. AOP można wykorzystać w celu usunięcia przeplatanego kodu, napisania czystszego kodu, zwiększenia abstrakcji i modułowości kodu, zmniejszenia kosztów utrzymania i rozwoju oraz uczynienia aplikacji łatwiejszymi w zarządzaniu i elastycznymi. PostSharp to jedno z najpopularniejszych dostępnych narzędzi, które można wykorzystać do implementacji AOP w aplikacjach.

Pierwsze kroki

Aby rozpocząć korzystanie z PostSharp, możesz zainstalować najnowszą stabilną wersję za pomocą konsoli Menedżera pakietów. Alternatywnie możesz zainstalować PostSharp za pomocą okna „Zarządzaj pakietami NuGet”. Aby rozpocząć korzystanie z PostSharp w swojej aplikacji, wykonaj następujące kroki.

1. Otwórz program Visual Studio 2015.

2. W menu Visual Studio kliknij Plik> Nowy> Projekt.

3. Wybierz szablon aplikacji konsolowej z listy wyświetlonych szablonów projektów.

4. Zapisz nowy projekt aplikacji konsolowej pod nazwą.

5. W menu programu Visual Studio kliknij opcję Narzędzia> Menedżer pakietów NuGet> Zarządzaj pakietami NuGet w celu rozwiązania.

6. Wyszukaj najnowszą stabilną wersję PostSharp i kliknij Zainstaluj.

I to wszystko, co musisz teraz zrobić. Po wyświetleniu monitu wybierz projekt (y), w których chcesz zainstalować PostSharp, i kliknij OK. Po zakończeniu instalacji możesz używać PostSharp w swojej aplikacji.

Programowanie PostSharp

Po zainstalowaniu PostSharp możesz zacząć używać go w swojej aplikacji. Aby to zrobić, musisz utworzyć co najmniej jeden aspekt, z którego będzie korzystać Twoja aplikacja. Jednym ze sposobów implementacji AOP w aplikacjach jest użycie atrybutów. Po zdefiniowaniu aspektu będziesz chciał zastosować aspekt do swojego programu poprzez atrybuty.

W oknie Eksplorator rozwiązań wybierz projekt, kliknij prawym przyciskiem myszy i dodaj nową klasę o nazwie ExceptionAspect. Należy zauważyć, że aspekt potrzebny do obsługi wyjątków w aplikacji powinien pochodzić z klasy OnExceptionAspect biblioteki PostSharp. OnExceptionAspect zawiera metodę o nazwie OnException, którą należy przesłonić, aby obsłużyć wyjątki. Poniższy kod ilustruje naszą niestandardową klasę aspektu wyjątków.

[Serializable]

    public class ExceptionAspect : OnExceptionAspect

    {

        public override void OnException(MethodExecutionArgs args)

        {

            Console.WriteLine("Error occured at: "+

            DateTime.Now.ToShortTimeString() + " Error Message: "+

            args.Exception.Message);

            args.FlowBehavior = FlowBehavior.Continue;

            base.OnException(args);

        }

    }

Każdy aspekt powinien być możliwy do serializacji - zwróć uwagę na użycie atrybutu [Serializable] w klasie ExceptionAspect pokazanej powyżej. Teraz, gdy aspekt jest już na miejscu, możesz zastosować go do jednej lub kilku metod w aplikacji przy użyciu atrybutów. Poniższy fragment kodu ilustruje przykładową metodę stosowania właśnie utworzonego aspektu wyjątku.

[ExceptionAspect]

 public static void TestExceptionAspect()

  {

      throw new Exception("This is a test message");

  }

Możesz zastosować właśnie utworzony niestandardowy aspekt wyjątku do jednej lub kilku metod w aplikacji - lub nawet na poziomie klasy. Jeśli aspekt zostanie zastosowany na poziomie klasy, zostaną obsłużone wyjątki zgłoszone przez dowolną metodę tej klasy. Aspekty PostSharp można również zastosować w całym zestawie. Ta funkcja jest znana jako multiemisja i można ją zastosować do docelowej przestrzeni nazw, określając następującą instrukcję w pliku AssemblyInfo.cs:

[zespół: ExceptionAspect (AttributeTargetTypes = "PostSharp. *")]

„PostSharp. *” W powyższym fragmencie kodu odnosi się do wszystkich typów, które są obecne w przestrzeni nazw PostSharp.

Klasa OnMethodBoundaryAspect umożliwia wykonywanie kodu niestandardowego przed i po wykonaniu metody. Chociaż jego metoda OnEntry jest wykonywana przed wykonaniem metody, do której zastosowano aspekt, metoda OnExit jest wykonywana po wykonaniu metody. Poniższa lista kodu ilustruje, w jaki sposób można zmierzyć czas wykonania metody przy użyciu aspektu. Poniższa klasa ExecutionTimeAspect dziedziczy klasę OnMethodBoundaryAspect i zastępuje metody OnEntry i OnExit.

 [Serializable]

    public class ExecutionTimeAspect : OnMethodBoundaryAspect

    {

        [NonSerialized]

        Stopwatch stopWatch;

        public override void OnEntry(MethodExecutionArgs args)

        {

            stopWatch = Stopwatch.StartNew();

            base.OnEntry(args);

        }

        public override void OnExit(MethodExecutionArgs args)

        {

            string method = new

            StackTrace().GetFrame(1).GetMethod().Name;

            string message = string.Format("The method: [{0}] took

            {1}ms to execute.",

                        method, stopWatch.ElapsedMilliseconds);

            Console.WriteLine(message);

            base.OnExit(args);

        }

    }

Możesz również dostosować powyższą metodę OnExit, aby rejestrować czas wykonywania metod. Teraz, gdy aspekt jest gotowy do użycia, można go zastosować do jednej lub kilku metod w celu pobrania czasu wykonania.

[ExecutionTimeAspect]

public static void TestExceptionAspect()

{

   //Some code

}

Możesz dowiedzieć się więcej o PostSharp, czytając dokumentację.