Использование PostSharp

Использование PostSharp

На сегодняшний день пожалуй всем известна такая тулза как PostSharp.

Данная библиотека предоставляет разработчику средства для аспектно-ориентированного программирования (АОП). Суть АОП заключается в том, что вы оперируете характерными особенностями типов и методов, не вдаваясь в детали реализации последних. Эти особенности называются аспектами. PostSharp позволяет задавать аспекты на различные методы и классы. Чтобы было понятно, что это и за чем это нужно, приведу примеры использования.

Итак, с помощью PostSharp можно написать набор атрибутов, которые потом можно будет использовать для всех ваших проектов. Чтобы наделить метод какой-либо особенностью (аспектом), достаточно лишь задать этому методу специальный атрибут.

Примеры аспектов, которые имеет смысл реализовывать при помощи PostSharp:

1. Логирование метода. Всё просто, пишете атрибут, после этого при навешивании его на любой метод, в лог будут выводиться записи о начале и конце работы метода.

2. Вычисление времени выполнения. Всё тоже самое. Задаете методу атрибут, после этого в логах будете видеть, сколько по времени выполнялся этот метод.

3. Обработка исключений.

4. Выполнение метода в отдельном потоке.

5. Использование метода с синхронизирующими локами.

6. Установка прав на выполнение метода.

А также многое другое. С PostSharp’ом вы получаете возможно написать свой кастомный код, который будет выполняться при вызове метода и при завершении его работы.

Перед тем, как приводить примеры использования, спешу ответить на немой вопрос читателей «а что с производительностью??». PostSharp работает в режиме build-time, т. е. модифицирует IL код при сборке приложения. Соответственно на времени выполнения это не сказывается. Разумеется при этом увеличивается время сборки солюшена, поэтому использовать данную библиотеку всё же стоит в тех местах, где это нужно, а не везде подряд.

Следующий интересный момент: лицензия. PostSharp предоставляет бесплатный вариант использования с ограничением функционала. Все фичи, описанные в данной статье, доступны в бесплатной версии.

Ниже приведу пару простейших примеров использования постшарпа. Хотя на самом деле возможности и область применения ограничиваются только лишь вашей фантазией.

Аттрибут, при навешивании которого на метод, будет писать в лог информацию о том, что управление было передано данному методу, и о том, что выполнение завершено.

/// <summary>

/// Аттрибут для логирования методов.

/// Пишет в лог, когда управление передается в метод, и когда он заканчивает работу

/// </summary>

[Serializable] internal class TraceAttribute : OnMethodBoundaryAspect { private static Logger _logger; public TraceAttribute() {

_logger = PostSharpConstants. Logger;

} public TraceAttribute(string logName) {

_logger = new Logger(logName);

} public override void OnEntry(MethodExecutionArgs args) {

_logger. Info("Старт метода " + args. Method);

} public override void OnExit(MethodExecutionArgs args) {

_logger. Info("Финиш метода " + args. Method);

}

}

Еще один атрибут, замеряет и выводит в лог время, за которое выполнился данный метод

/// <summary>

/// Выводит в лог время выполнения метода

/// </summary>

[Serializable] internal class TraceExecutionTimeAttribute : OnMethodBoundaryAspect { private static readonly Stopwatch _stopwatch = new Stopwatch(); private static Logger _logger; public TraceExecutionTimeAttribute() {

_logger = PostSharpConstants. Logger;

} public TraceExecutionTimeAttribute(string logName) {

_logger = new Logger(logName);

} public override void OnEntry(MethodExecutionArgs args) {

_stopwatch. Start();

} public override void OnExit(MethodExecutionArgs args) {

_stopwatch. Stop();

_logger. Info("Время выполнения метода" + args. Method + " составляет : " + _stopwatch. Elapsed);

}

}

В общем заюзать библиотеку однозначно стоит, по крайней мере попробовать. Пожалуй, это лучшее решение из существующих для данных задач.

Единственный минус, который в некоторых проектах может быть весьма существенным, это невозможность собрать x64-билд на 32-разрядной тачке.


Карта сайта


Информационный сайт Webavtocat.ru