Я играю с расширением Ninject Interception. запись в блоге Яна Дэвиса об этом указывает, что перехват всегда основан на фактическом типе службы, а не на интерфейсе. Например, следующий код не будет работать, потому что IFoo
— это интерфейс:
Kernel.InterceptBefore<IFoo>(f => f.DoSomething(),
i => Console.WriteLine("before"));
И, конечно же, следующий фрагмент кода будет работать только в том случае, если Foo.DoSomething
равно virtual
:
Kernel.InterceptBefore<Foo>(f => f.DoSomething(),
i => Console.WriteLine("before"));
Это кажется довольно вопиющей дырой, когда дело доходит до аспектно-ориентированного программирования. Я довольно добросовестно программировал интерфейсы, чтобы мы могли использовать фиктивные фреймворки для имитации наших различных сервисов, но подавляющее большинство моих фактических реализаций методов не являются виртуальными. Если фиктивный фреймворк может создать IFoo
с помощью метода, который делает то, о чем я прошу, кажется, что Ninject должен уметь это делать.
Поэтому я думаю, что мой вопрос двоякий:
- Есть ли причина, по которой Ninject Interception не позволяет привязываться к методам интерфейса?
- Есть ли простой способ заставить Ninject привязываться к динамическим классам-оболочкам, которые могут позволить мне выполнять определенные действия по перехвату всех методов интерфейса, а затем передавать вызов реальной реализации?