Прежде чем я начну, я хотел бы уточнить, что мое текущее понимание терминологии АОП следующее ...
- Аспекты - это АОП-эквивалент классов в ООП.
- Советы - это АОП-эквивалент методов в ООП.
- Pointcuts - это АОП-эквивалент «использования» кода в ООП. В ООП мы вызываем вещи. В АОП плетем вещи. Решение что плести, где определяется Pointcuts.
К собственно вопросу ...
У меня есть аспект ведения журнала в PostSharp, который я хочу использовать (переплетать) для каждого метода, за исключением свойств. Изначально в моем аспекте я использовал следующее:
[MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Instance)]
Однако я обнаружил, что аспект все еще вплетался в свойства, а это означает, что мне пришлось выполнить вторичную проверку во время выполнения, чтобы предотвратить выполнение моего кода для свойств:
if (!methodName.StartsWith("set_") && !methodName.StartsWith("get_")) {
Это не идеально. Я должен иметь возможность определить это поведение в моем pointcut, чтобы мне не приходилось выполнять какие-либо проверки во время выполнения.
Я изучал атрибут MethodPointcut
, который, кажется, предоставляет мне обратный вызов, чтобы помочь ткачу выбрать кандидатов для совета во время сборки. Можно посмотреть пример?
Предполагая, что это работает, я все еще думаю: «Почему я должен жестко кодировать Pointcuts для моих советов?». Аспекты и советы - это определение / реализация. Pointcuts - это использование. Эти двое должны быть разделены.