PostSharp Pointcuts - PullRequest
       31

PostSharp Pointcuts

2 голосов
/ 06 июля 2011

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

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

По фактическому вопросу ...

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

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

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

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

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

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

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

1 Ответ

3 голосов
/ 06 июля 2011

Свойства - методы, два метода, если быть точным. Помните, что PostSharp работает, ПОСЛЕ MSBuild превращает ваш C # в MSIL.

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

Вы также можете сделать это с помощью многоадресной рассылки. См. Следующую статью о принципах PostSharp для ознакомления с данными о 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 (наряду с несколькими другими) предназначен для сложных аспектов. На следующей неделе будет опубликована статья об этом.

...