Расширение функциональности с использованием метаданных и аспектно-ориентированного программирования Александр Межов ОАО ЧЭМК 3-я конференция.NET разработчиков 25 сентября 2011
Немного теории
Metadata Метаданные (Metadata) Данные об объекте, характеризующие его в некотором контексте использования (аспекте)
Aspect Аспект (Aspect) Сквозная (инфраструктурная) функциональность, которая инкапсулирует некоторое общее поведение
Примеры аспектов Обработка ошибок Трассировка запросов Проверка прав доступа Аудит (логирование) изменений...
Join point Точка слияния (Join point) Место, куда будет встроен код аспекта (например, вызов метода)
Advice Подача (Advice) Встраиваемый код, который может быть выполнен до, после или в самой точке соединения
Metadata & Aspect Metadata Aspect 1 Aspect 2 Aspect 3
Реализации PostSharp Подача через атрибуты Aspect.NET Подача через атрибуты Spring.NET AOP Подача через перехват вызовов Unity Подача через перехват вызовов
Подача через атрибуты
Просто добавлять (+) Можно тестировать (+) Экземпляры создаются через new (+) Сложно модифицировать (–) Увеличивает связность аспектов (–)
Слишком много атрибутов
Подача через перехват вызовов
Подача через атрибуты Просто добавлять (+) Можно тестировать (+) Просто модифицировать (+) Аспекты никак не связаны (+) Экземпляры создаются через фабрику (–)
Unity & AOP
Перехват методов интерфейса Перехват методов класса (virtual, abstract) Возможности Unity Proxy Target Client Перехват чики Interceptors
Demo: Unity Interception
Аудит изменений Вариант решения
Что будем использовать Unity 2.0 Unity 2.0 Unity Application Block (Unity)
Metadata & Aspect Metadata History Aspect … … … …
Работа с метаданными Создаются для определенного типа Содержат информацию об аспектах Хранятся в отдельной сборке (сборках)
Пример метаданных Определение типа: Определение метаданных для типа: Аспект истории
Поиск метаданных Сборка метаданных:..\Metadata\{Type Assembly}.Metadata.dll Класс метаданных: {Type Name}Metadata : IMetadata
Аспект истории Формирует список изменений (change set) для конкретного действия с данными: Inset, Update и Delete
Перехватчик для аудита Перехватывает вызовы хранилища (repository) в момент создания, изменения или удаления объекта
Регистрация перехватчика Где-то на этапе инициализации приложения…
Как использовать?
Demo: History Aspect
Ссылки Материалы конференции Аспектно-ориентированное программирование, перехват и Unity 2.0 (Дино Эспозито) Перехватчики в Unity (Дино Эспозито)
Спасибо за внимание Александр Межов ОАО ЧЭМК