2010-08-02 2 views
1

Есть ли способ перехватить вызов метода класса, чтобы вы могли сделать АОП?Как перехватить вызов метода класса

например.

Я хочу Teacher.Talk() выполняет по-разному в двух сценариях:

class School 
{ 
    [Fun] 
    public void Picnic { 
     Teacher t = new Teacher(); 
     t.Talk(); 
    } 

    public void Seminar{ 
     Teacher t = new Teacher(); 
     t.Talk(); 
    } 
} 

В коде выше, функция Пикник украшена Fun атрибутом, поэтому функция разговора учителя гораздо интереснее, чем один в функции Семинара, который не украшен атрибутом.

Я проверил Castle.DynamicProxy, но он использует прокси-класс и нуждается в некоторой модификации кода. Это не помогает решить мою проблему, потому что я хочу использовать этот атрибут для настройки, так что, когда решение изменится, потребуется очень мало модификаций кода.

Большое спасибо!

ответ

1

Существует два основных подхода: создание прокси-класса подкласса или изменение кода, например, «компиляция во времени», чтобы ввести крючки в скомпилированную сборку.

Подклассификация позволяет перехватывать виртуальные методы и конструкторы, в то время как сплетение во время компиляции может вводить крючки в любом месте для перехвата вызовов в кодовой базе.

+0

Спасибо, но подклассификация обеспечивает решение моей проблемы. Мне нужно настроить поведение объекта в области действия, а не в области времени. – Roy

+0

Он обеспечивает только часть решения. Вам нужно будет: 1) Используйте TeacherFactory, чтобы скрыть тот факт, что вы можете отправлять обратно прокси. 2) В прокси-сервере вам нужно будет запустить стек вызовов и проверить методы в стеке для таких атрибутов, как FunAttribute, которые вас интересуют. 0) Молитесь, чтобы ваш метод Teacher.Talk не назывался 1 миллион раз в где-то внутри. ;-) – SargeATM

1

После исследования той же проблемы несколько месяцев назад единственным приемлемым решением, которое я нашел, было использование PostSharp. http://www.sharpcrafters.com/

Даже это не идеально, потому что оно отключает Edit/Continue в классах с использованием атрибутов (дайте или возьмите).

+0

[CodeCop] (http://getcodecop.com/) - это библиотека, которая построена поверх JSON, чтобы обеспечить быстрый ненавязчивый способ написания меток-перехватчиков для ваших приложений .NET. [Здесь] (https://bitbucket.org/codecop_team/codecop/wiki/Home) является wiki. Вы можете попробовать это :) –

Смежные вопросы