Аспектно-орієнтоване програмування в postsharp, блог влада Сухачева

Обробка винятків

У методі OnEntry відбувається створення транзакції, метод OnException обробляє виключення, а метод OnSuccess викликається якщо операція не викинула виключення. Клас TransactionAttribute є аспектом (aspect) в термінології AOP, методи OnEntry, OnException, OnExit - порадами (advices). Залишилося тільки з'ясувати, як нам застосувати аспект. Для цього потрібно позначити метод DeleteOrder атрибутом [Transaction].

Кешування результатів виклику функції

Кешовані значення зберігаються в змінної класу _cache, яка оголошена як Dictionary. Для кожного набору аргументів обчислюється строковий ключ за допомогою методу MakeKey. Якщо ключ присутній в словнику, то виклику функції не відбувається. В іншому випадку функція неявно викликається через args.Proceed () і результат зберігається в словнику. Метод MakeKey отримує список аргументів і об'єкт, чий метод викликається і повертає строковий хеш для даного виклику.
В змінної _methodName зберігається ім'я методу, воно стає відомим на етапі компіляції.
Приклад використання кешування виклику функцій виглядає наступним чином.

Валідація значень властивостей

Валідація при присвоєнні нового значення властивості ускладнює код присвоювання. Було б зручно робити це декларативно за допомогою атрибутів властивостей. У прикладі нижче властивість Customer.Name перевіряється за допомогою регулярного виразу. Перевірка здійснюється в момент присвоювання нового значення, тобто фактично в реалізації set.

Для того щоб цей код працював нам знадобиться створити клас RegExpValidatorAttribute, похідний від LocationInterceptionAspect. Даний аспект дозволяє вставляти свій код в реалізацію set або get для заданого властивості.