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

时间:2011-02-09 21:53:55

标签: aop ninject-2 ninject-extensions

我正在玩Ninject Interception扩展程序。关于它的Ian Davis's blog post表示拦截始终基于实际的服务类型,而不是接口。例如,以下代码无效,因为IFoo是一个接口:

Kernel.InterceptBefore<IFoo>(f => f.DoSomething(), 
    i => Console.WriteLine("before"));

当然,下一个代码段仅在Foo.DoSomethingvirtual时才有效:

Kernel.InterceptBefore<Foo>(f => f.DoSomething(), 
    i => Console.WriteLine("before"));

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

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

  1. 是否有任何理由Ninject Interception 允许您绑定到接口方法?
  2. 有没有一种简单的方法可以让Ninject绑定到动态“包装器”类,它可以让我对所有接口方法执行某些拦截操作,然后将调用传递给真正的实现?

1 个答案:

答案 0 :(得分:5)

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