拦截Ninject拦截扩展中的接口方法

Str*_*ior 4 aop ninject-2 ninject-extensions

我正在玩Ninject Interception扩展.Ian Davis关于它的博客文章表明,拦截总是基于实际的服务类型,而不是接口.例如,以下代码将无效,因为它IFoo是一个接口:

Kernel.InterceptBefore<IFoo>(f => f.DoSomething(), 
    i => Console.WriteLine("before"));
Run Code Online (Sandbox Code Playgroud)

当然,接下来的这段代码会只有工作Foo.DoSomethingvirtual:

Kernel.InterceptBefore<Foo>(f => f.DoSomething(), 
    i => Console.WriteLine("before"));
Run Code Online (Sandbox Code Playgroud)

在涉及面向方面的编程时,这似乎是一个非常明显的漏洞.我一直非常认真地对接口进行编程,以便我们可以使用模拟框架来模拟我们的各种服务,但绝大多数实际的方法实现都不是虚拟的.如果一个模拟框架可以生成一个IFoo满足我要求的方法,那么Ninject似乎应该能够.

所以我想我的问题是双重的:

  1. 有什么理由Ninject拦截不会让你绑定到接口的方法呢?
  2. 有没有一种简单的方法可以让Ninject绑定到动态"包装器"类,这些类可以让我对所有接口方法执行某些拦截操作,然后将调用传递给真正的实现?

Rem*_*oor 5

我对此做了一些尖峰,似乎可以将这种行为纳入拦截扩展.但是,由于我们计划在不久的将来发布2.2版本,你必须要有点耐心.我非常喜欢这个改变所以我打算把它添加到2.4.穗也远没有生产力.所有当前的单元测试都在运行.但是有很多新功能需要添加此功能.如果你愿意,我可以发给你一个补丁,但我不会给你任何支持和保证,目前它没有错误.