4

我正在玩 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 似乎应该能够做到。

所以我想我的问题有两个:

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

1 回答 1

5

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

于 2011-02-10T19:01:14.660 回答