c# - 如何使用 Ninject 设置可选的方法拦截?

标签 c# .net ninject aop ninject-interception

假设我有一个类,有时我想*(但现在总是)拦截一些(但不是全部)方法。按照我的理解,这可以通过我的 Ninject 模块中的 InterceptAround() 来完成(在更高级别的代码中),或者通过这些方法上的 InterceptAttribute 派生属性(在实现水平)。

我不太喜欢第一种方式,因为它需要消费者了解细节,会有很多类和很多方法。但我也不喜欢第二种方式,因为我不知道如何禁用(或者更确切地说,不启用)拦截,因为属性与代码融合在一起。

是否有一些已知的方法可以解决这个问题?


*:在应用程序的生命周期内。

最佳答案

听起来好像您指的是普通的动态拦截器,这就是 Ninject 拦截扩展默认情况下的工作方式。

这是一个条件拦截的例子:

class CustomInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        if (invocation.Request.Method.Name == "MethodToIntercept")
            Console.WriteLine("Intercepted!");
        invocation.Proceed();
    }
}

您可以像这样将它直接绑定(bind)到单个类:

public class MyModule : NinjectModule
{
    public override void Load()
    {
        Bind<IFoo>().To<MyFoo>().Intercept().With<CustomInterceptor>();
    }
}

如果您想动态拦截单个类,这几乎就是您要做的所有事情。

内核扩展看起来很有前途,因为它们允许您将条件直接写入声明:

kernel.Intercept(ctx => ctx.Request.Service == typeof(IFoo))
    .With<CustomInterceptor>();

但是,如果您尝试根据正在执行的方法 做出决定,这并不是特别有用,因为这只允许您访问绑定(bind)上下文,而不是调用。主要是,此扩展的存在是为了让您可以选择在运行时拦截哪些服务(与方法相对)。

最好坚持绑定(bind)语法,并将运行或不运行逻辑直接写入拦截器,如第一个示例所示。

需要注意的一件重要事情是,动态拦截器实际上会为它绑定(bind)到的任何类上的每个(公共(public)/虚拟)方法运行,这可能非常低效。不幸的是,Ninject 拦截扩展必须采用最低公分母方法,因为它旨在支持多个代理库。如果直接使用CaSTLe,可以use proxy generation hooks and interceptor selectors for fine-grained control ,这实际上是推荐的方法。据我从 Ninject-DP2 源代码中得知,Ninject 扩展不支持这一点。

就个人而言,正是出于这个原因,我在 Ninject Interception 扩展方面从未取得过很大的成功,并且倾向于坚持直接使用 CaSTLe DP2。但是,如果您是小规模执行此操作并且不编写对性能敏感的应用程序,则编写动态拦截器应该没问题。

关于c# - 如何使用 Ninject 设置可选的方法拦截?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7040235/

相关文章:

c# - 使用带有可变文本的正则表达式替换文本?

c# - 如何在 c# ASP.Net 中创建具有有效 JSON 输出并使用 JQuery/Ajax 进行查询的 JSON WebService

c# - 删除对象序列中的连续重复项

c# - 无法让 Ninject.Extensions.Conventions 工作

dependency-injection - 如何创建即将到期的单例绑定(bind)?

c# - 在 Page_Init 期间强制使用 HTTPS 的最简单方法

c# - boolean 值的 GetHashCode 是如何实现的?

.net - 在 .NET HttpHandler 中检测字节范围请求

javascript - 正则表达式允许无限精度

c# - Ninject 和 DataContext 处置