#conditional #aop #execution #postsharp
#условные операторы #aop #выполнение #postsharp
Вопрос:
Мы находимся в процессе внедрения PostSharp в одном из наших проектов. До сих пор это работало отлично! Однако есть одна вещь, которую нам не удалось решить: как условно запускать рекомендации.
Подробности: — у нас есть атрибут StopWatchAttribute, который позволяет записывать время, необходимое для запуска методов — этот атрибут принимает перечисление «LoggingLevel», которое задается в файле конфигурации со значениями типа 0, 1, 2 и т.д. — этот параметр считывается в базовом классе с именем BaseService во время выполнения: new BaseService().CurrentLoggingSettings — мы попытались настроить конструктор атрибута как StopWatchAttribute(new BaseService(). CurrentLoggingLevel), но мы получаем ошибку компиляции: аргумент атрибута должен быть постоянным выражением, выражением typeof или выражением создания массива типа параметра атрибута.
—> резюме: мы хотели бы, чтобы рекомендации вызывались условно, а условие зависело от параметра в конструкторе атрибута.
Возможно ли это сделать?
Спасибо за вашу помощь, Андрас
Ответ №1:
Вы не можете присваивать переменные атрибутам, PostSharp это или нет. Поскольку вы уже считываете значения из конфигурации, просто настройте свой аспект так, чтобы он делал то же самое в методе Initialize(). Переопределите его в классе aspect, а затем сохраните значение в локальном поле. Вы можете использовать это поле во всем аспекте. Это компилирует значение в аспект, по сути жестко кодируя его.
Или вы можете извлечь значение из конфигурации из вашего метода рекомендаций (onmethod Start и т.д.), Чтобы вы могли изменять его в конфигурации во время выполнения. Это более «гибкий» способ сделать это, поскольку он ничего не требует жесткого программирования.
Помните, что ваши переменные устанавливаются во время выполнения. PostSharp — это фреймворк после компиляции, что означает, что он выполняет свою работу задолго до того, как ваши переменные становятся известны JIT.