我正在玩 Ninject Interception 扩展。Ian Davis 关于它的博客文章表明,拦截总是基于实际的服务类型,而不是接口。例如,以下代码将不起作用,因为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 绑定到动态“包装器”类,让我对所有接口方法执行某些拦截操作,然后将调用传递给真正的实现?