Я играю с расширением 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 к динамическим классам-оберткам, который позволяет мне выполнять определенные действия по перехвату всех методов интерфейса, а затем передавать вызов в реальную реализацию?