听起来好像您指的是普通的动态拦截器,这就是 Ninject Interception 扩展默认的工作方式。
这是一个条件拦截的示例:
class CustomInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
if (invocation.Request.Method.Name == "MethodToIntercept")
Console.WriteLine("Intercepted!");
invocation.Proceed();
}
}
您可以将其直接绑定到单个类,如下所示:
public class MyModule : NinjectModule
{
public override void Load()
{
Bind<IFoo>().To<MyFoo>().Intercept().With<CustomInterceptor>();
}
}
如果您想动态拦截单个类,这几乎就是您所要做的全部事情。
内核扩展look有前途,因为它们允许您将条件直接写入声明中:
kernel.Intercept(ctx => ctx.Request.Service == typeof(IFoo))
.With<CustomInterceptor>();
但是,如果您尝试根据以下情况做出决策,这并不是特别有用method正在执行,因为这只能让您访问绑定上下文,而不是调用。主要是,这个扩展的存在是为了让你可以选择哪个classes or services(相对于methods) 在运行时拦截。
最好坚持绑定语法,并将运行或不运行逻辑直接写入拦截器,如第一个示例所示。
需要注意的一件重要事情是动态拦截器实际上会运行every(公共/虚拟)方法无论它绑定到哪个类,这可能非常低效。不幸的是,Ninject Interception 扩展必须采用最低公分母方法,因为它旨在支持多个代理库。如果直接使用Castle就可以,这实际上是推荐的方法。据我从 Ninject-DP2 源代码来看,Ninject 扩展不支持这一点。
就我个人而言,正是由于这个原因,我从未在 Ninject Interception 扩展方面取得过很大的成功,并且倾向于直接使用 Castle DP2。但是,如果您正在小规模地执行此操作并且不编写性能敏感的应用程序,那么您应该可以编写动态拦截器。