Почему Виндзор может перехватывать только виртуальные или сопряженные методы? - PullRequest
2 голосов
/ 20 декабря 2011

Я читаю документацию и вижу, что если вы не используете интерфейс, то Windsor может перехватывать только виртуальные методы?

Это ограничение для Windsor или просто языка C #?Я ищу подробный ответ.

Ответы [ 4 ]

4 голосов
/ 20 декабря 2011

Язык C # здесь совершенно неактуален. Вопрос в том, как перехват работает на уровне времени выполнения.

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

Другой способ - использовать API профилирования. Это позволяет изменять IL любого метода, в том числе не виртуального. Это гораздо более навязчиво и обычно используется только при тестировании устаревшего кода.

Еще один способ - перезапись IL во время сборки. Это может добавить точки перехвата в код, который вы написали, но не в коде фреймворка.

2 голосов
/ 20 декабря 2011

Это ограничение .NET Framework.Windsor создает динамическую реализацию, которая либо реализует интерфейс, либо переопределяет виртуальный член..NET не разрешает переопределять не виртуальные элементы.

2 голосов
/ 20 декабря 2011

Ни то, ни другое. Виндзор работает с помощью подклассов, и вы можете только разумно переопределить виртуальные методы - или интерфейсы могут быть реализованы.

Все остальное требует активных перехватчиков отладчика / профилировщика, и это сложно сделать - некоторые фальшивые фреймворки поддерживают, хотя ни одна из них не является бесплатной.

0 голосов
/ 06 января 2012

Да, вам нужны виртуалы, но это только потому, что Microsoft испортила это поведение. Если вы посмотрите на Java, например, метод по умолчанию открыт для расширения, вы должны явно пометить его как закрытый.

Подробнее о принципах SOLID, в частности, Open Closed Principle.

...