PostSharp Pointcuts

Прежде чем я начну, я хотел бы уточнить, что мое текущее понимание терминологии АОП следующее ...

  • Аспекты - это АОП-эквивалент классов в ООП.
  • Советы - это АОП-эквивалент методов в ООП.
  • Pointcuts - это АОП-эквивалент «использования» кода в ООП. В ООП мы вызываем вещи. В АОП плетем вещи. Решение что плести, где определяется Pointcuts.

К собственно вопросу ...

У меня есть аспект ведения журнала в PostSharp, который я хочу использовать (переплетать) для каждого метода, за исключением свойств. Изначально в моем аспекте я использовал следующее:

[MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Instance)]

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

if (!methodName.StartsWith("set_") && !methodName.StartsWith("get_")) {

Это не идеально. Я должен иметь возможность определить это поведение в моем pointcut, чтобы мне не приходилось выполнять какие-либо проверки во время выполнения.

Я изучал атрибут MethodPointcut, который, кажется, предоставляет мне обратный вызов, чтобы помочь ткачу выбрать кандидатов для совета во время сборки. Можно посмотреть пример?

Предполагая, что это работает, я все еще думаю: «Почему я должен жестко кодировать Pointcuts для моих советов?». Аспекты и советы - это определение / реализация. Pointcuts - это использование. Эти двое должны быть разделены.


person Lawrence Wagerfield    schedule 06.07.2011    source источник


Ответы (1)


Свойства ЯВЛЯЮТСЯ методами, точнее, двумя методами. Помните, PostSharp выполняет свою работу ПОСЛЕ того, как MSBuild превращает ваш C # в MSIL.

Вы делаете это не во время выполнения, а во время компиляции. Переопределите метод CompiletimeValidate () и переместите туда свой проверочный код. Если метод совпадает, верните false, иначе верните true. PostSharp использует этот метод, чтобы определить (во время компиляции), будет ли аспект применяться к цели. Во время выполнения ничего не должно происходить.

Вы также можете сделать это с помощью многоадресной рассылки. Подробнее об этом см. В следующей статье PostSharp Principals http://www.sharpcrafters.com/blog/post/Day-3-Applying-Aspects-with-Multicasting-Part-2.aspx

[assembly: MyAspect(AspectPriority = 10)] 
[assembly: MyAspect(AspectPriority = 0,  
    AttributeExclude = true, AttributeTargetMembers = "regex:get_.*|set_.*")]

MethodPointcut (наряду с некоторыми другими) предназначен для сложных аспектов. На следующей неделе выйдет статья об этом.

person Dustin Davis    schedule 06.07.2011
comment
Спасибо за это. Что же тогда определяет MulticastTargets.Property? - person Lawrence Wagerfield; 06.07.2011
comment
Метод = Методы, но не конструктор, Свойство = Свойства, но не методы. doc.sharpcrafters.com/posts#harp/ PostSharp.chm / html / - person Dustin Davis; 06.07.2011