Я читаю документацию и вижу, что если вы не используете интерфейс, то Windsor может перехватывать только виртуальные методы?
Это ограничение Windsor или просто языка C#? Я ищу подробный ответ.
Я читаю документацию и вижу, что если вы не используете интерфейс, то Windsor может перехватывать только виртуальные методы?
Это ограничение Windsor или просто языка C#? Я ищу подробный ответ.
Язык C# здесь совершенно не при чем. Вопрос в том, как перехват работает на уровне выполнения.
Один из методов наследует от класса/реализует интерфейс и использует его в качестве прокси. Это, очевидно, может переопределить только виртуальные методы и методы интерфейса. Я подозреваю, что Виндзор использует эту технику. Преимущество этой техники в том, что она не требует ничего особенного. Просто создайте класс во время выполнения.
Другой способ — использовать профилирующий API. Это позволяет модифицировать IL любого метода, в том числе не виртуального. Это гораздо более навязчиво и обычно используется только при тестировании устаревшего кода.
Еще один способ — переписать IL во время сборки. Это может добавить точки перехвата в код, который вы написали, но не в код фреймворка.
Это ограничение платформы .NET. Windsor создает динамическую реализацию, которая либо реализует интерфейс, либо переопределяет виртуальный элемент. .NET не позволяет переопределять члены, которые не являются виртуальными.
Ни ни. Windsor работает путем создания подклассов, и вы можете только разумно переопределять виртуальные методы - или интерфейсы могут быть реализованы.
Для всего остального требуются активные хуки отладчика/профилировщика, а это сложно сделать - поддерживаются некоторые имитирующие фреймворки, т.е. хотя ни один из них не является бесплатным.
Да, вам нужны виртуалы, но это только потому, что Microsoft испортила это поведение, если вы посмотрите, например, на Java, метод открыт для расширения по умолчанию, вы должны явно пометить его как запечатанный.
Узнайте больше о принципах SOLID, в частности о принципах Open Closed.