如何使用 Ninject 设置可选方法拦截?

2024-04-12

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

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

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


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


听起来好像您指的是普通的动态拦截器,这就是 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。但是,如果您正在小规模地执行此操作并且不编写性能敏感的应用程序,那么您应该可以编写动态拦截器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Ninject 设置可选方法拦截? 的相关文章

  • 如何在编译C代码时禁用警告?

    我正在使用 32 位 Fedora 14 系统 我正在使用编译我的源代码gcc 有谁知道如何在编译c代码时禁用警告 EDIT 是的 我知道 最好的办法是修复这些警告以避免任何未定义 未知的行为 但目前在这里 我第一次编写了巨大的代码 并且在
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 方法“xxx”不能是事件的方法,因为该类派生的类已经定义了该方法

    我有一个代码 public class Layout UserControl protected void DisplayX DisplayClicked object sender DisplayEventArgs e CurrentDi
  • 如何使用 wpf webbrowser 将数据发布到 Web 服务器

    我想从数据库获取数据并使用它来让用户登录到网站 我有一个包含 Web 浏览器控件的 wpf 页面 我有这样的代码 用于将用户登录到用 php 编写的网站
  • 指向字节数组的指针

    由于 Misra C 的要求 我的一位同事想要使用指针声明 但我遇到了一些问题 Misra 安全关键指南 不会让我们纯粹的程序员使用指针 但会让我们对数组字节进行操作 他打算获取一个指向字节数组的指针 因此我们不会在堆栈上传递实际的数组 T
  • 手动将 ClientBase 集合类型从 Array[] 更改为 List<>

    我将自己的 WCF 代理与 Client Base 一起使用 我想做一些类似于 svc util 中的 ct 属性的操作 并告诉代理返回 List 集合类型 我不能使用 List 因为实体由 nhibernate 管理 所以我必须使用 IL
  • 如何添加重试以调用 Web 服务?

    我有一个应用程序调用使用 wsHttpBinding 的 Web 服务 我需要在连接超时等情况下对 Web 服务调用实现某种重试功能 执行此操作的最佳方法是什么 我已经阅读过有关 WS ReliableMessaging 的内容 但这不是
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • 错误左值需要作为赋值C++的左操作数

    整个程序基本上只允许用户移动光标 如果用户位于给定的坐标范围 2 2 内 则允许用户键入输入 我刚刚提供了一些我认为足以解决问题的代码 我不知道是什么导致了这个问题 你能解释一下为什么会发生吗 void goToXY int int 创建一
  • 正确使用“extern”关键字

    有一些来源 书籍 在线材料 解释了extern如下 extern int i declaration has extern int i 1 definition specified by the absence of extern 并且有支
  • .NET JIT 编译的代码缓存在哪里?

    NET 程序首先被编译为 MSIL 代码 当它被执行时 JIT编译器会将其编译为本机机器代码 我想知道 这些JIT编译的机器代码存储在哪里 它只存储在进程的地址空间中吗 但由于程序的第二次启动比第一次快得多 我认为即使在执行完成后 该本机代
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • 为什么使用 HTTP 动词?

    因为动词的目标是像 server domain getallrecords 或 server domain delete1record 或类似的 URL 而getallrecords delete1record都是专门为特定目的而设计的 为
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • System.IO.Compression 和 ZipFile - 提取并覆盖

    我使用标准 VB NET 库来提取和压缩文件 它也可以工作 但是当我必须提取并且文件已经存在时 问题就出现了 我使用的代码 Imports Imports System IO Compression 崩溃时我调用的方法 ZipFile Ex
  • 从有符号字符转换为无符号字符然后再转换回来?

    我正在使用 JNI 并有一个 jbyte 类型的数组 其中 jbyte 表示为有符号字符 即范围从 128 到 127 jbyte 表示图像像素 对于图像处理 我们通常希望像素分量的范围为0到255 因此 我想将jbyte值转换为0到255
  • g++ C++0x 枚举类编译器警告

    我一直在将可怕的 C 类型安全伪枚举重构为新的 C 0x 类型安全枚举 因为它们是way更具可读性 不管怎样 我在导出的类中使用它们 所以我明确地将它们标记为导出 enum class attribute visibility defaul
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task
  • FindAsync 很慢,但是延迟加载很快

    在我的代码中 我曾经使用加载相关实体await FindAsync 希望我能更好地遵守 C 异步指南 var activeTemplate await exec DbContext FormTemplates FindAsync exec

随机推荐

  • 使用 ngRepeat 时限制显示结果的数量

    我找到了AngularJS 教程 https docs angularjs org tutorial很难明白 这个正在引导我构建一个显示手机的应用程序 我上线了step 5 https docs angularjs org tutorial
  • 在 org-agenda 上查看中国/韩国/农历生日?

    我周围有一些人使用农历而不是公历 所以我当前的设置 Birthdays PROPERTIES CATEGORY Birthday END NAME lt 1980 09 09 Thu 1y gt 未能在正确的时间出现org agenda 我
  • 获取父类中子类的名称(静态上下文)

    我正在构建一个 ORM 库 考虑到重用性和简单性 一切都很顺利 除了我被一个愚蠢的继承限制所困扰 请考虑下面的代码 class BaseModel Return an instance of a Model from the databas
  • 目标的事件委托

    在下面的代码中 我的click事件代表和所有三个 click 我的视图层次结构中的处理程序被解雇 不过我也想火 edit 在我的整个视图层次结构中 edit 只是我的元素的目标 child view Template
  • Mac 上的 python xgboost 安装

    我正在尝试在 Mac 上安装 xgboost for Python 3 4 但之后出现以下错误pip3 setup py install File
  • 在 openMP C++ 中并行化许多嵌套 for 循环

    你好 我是 C 新手 我编写了一个可以运行的代码 但是由于许多嵌套的 for 循环 它很慢 我想通过 openmp 来加速它 任何可以指导我的人 我尝试使用 pragma omp 并行 前ip循环并在这个循环中我使用了 pragma omp
  • 如何使用 Html.EditorFor 和 MVC3 设置 id

    我试图设置一个字段 id 如下所示 Html EditorFor x gt x Order new id string Format Order 0 Model Row 但这会导致以下结果 并且似乎我的 id 没有被设置
  • 在 Spring 3 控制器中返回字符串时设置重定向的 HTTP 状态代码

    有没有办法在返回时指定HTTP状态码 redirect new url 春季3 没试过 不过看看源码org springframework web servlet view RedirectView it has getHttp11Stat
  • 直线和绘图之间的阴影区域

    我已经彻底搜索了网络 但仍然没有找到确切的解决方案 我需要在 MATLAB 中对直线上方和绘图下方的相交区域进行着色 我需要对阈值 110 以上和绘图下方的区域进行着色 这是一种使用方法area generate data x 1 100
  • mysql从具有不同键的同一列进行多个连接

    我需要一些帮助来与下表进行第二次连接 我之前从这里得到了一些帮助 建议我需要添加第二个 JOIN 但是 这就是我陷入困境并需要一些帮助的地方 wp posts id Post Title 01 Event 1 02 Event 2 wp 后
  • Go:如何接收整个 UDP 数据报

    我的问题 使用 net Read 方法仅复制给定字节数组或切片大小的字节数 当然 我不想每次都分配最大 64 kB 的 UDP 数据报 有没有go如何确定数据报的大小 位于数据报头中 或再次读取直到数据报完全读取 Try 从UDP读取 ht
  • jenkins android找不到sdkmanager.jar

    我在 Mac 操作系统上运行 Jenkins 我有一个尝试执行的 ant 构建文件
  • 使用 Drupal 中的外部身份存储库验证注册数据

    当我的用户尝试注册时 我想通过检查外部身份存储库 例如调用 Web 服务或查找目录服务器 来确保他的信息有效 任何现有模块都可以实现这一点吗 如果没有 开发此功能的最佳方法是什么 我不知道现有模块允许添加自定义验证 但使用 验证 操作来实现
  • 如何在flutter中为android和iOS进行face id身份验证

    您好 我尝试寻找有关在 flutter 中使用面部 ID 进行身份验证的资源 该资源适用于 Android 和 iOS 我尝试搜索一些资源 但大多数人都说face id仅在iOS中可用 有没有任何指南或资源可供我阅读以在 Android 和
  • javascript将元素推入数组的开头[重复]

    这个问题在这里已经有答案了 我有一个对象数组 我想将一个元素推入数组的开头 我有这个 var TheArray TheObjects Array TheArray push TheNewObject 正在添加TheNewObject在最后
  • 在基于mysql中的选择的插入期间增加非自动增量字段

    我使用 select 语句将一个表中的记录插入到另一个表中 插入的表有一个新字段 该字段应在每次更新时递增 1 但不应是自动递增字段 因为每次更新每组记录的数字都需要重新开始 如果使用的 select 语句选择 42 条记录 则新表将具有一
  • AngularJS Protractor - 使用 Ng-Click 绑定查找页面上的元素

    我的页面上有一个按钮 如下所示
  • Bootstrap 3 导航丸不起作用

    我已遵循文档 但我不确定为什么我的pills不工作 HTML
  • gremlin 查询中的类型转换

    如何使用 AWS Neptune GDB 在 gremlin 控制台中将字符串值转换为整数类型 我的属性 age 带有字符串值 需要将其转换为整数类型以进行查询中的数学运算 感谢所有建议 我尝试了以下 kelvin 建议的查询 但遇到了这些
  • 如何使用 Ninject 设置可选方法拦截?

    假设我有一个类 我有时想 但现在总是 拦截一些 但不是全部 方法 据我了解 这可以通过以下方式完成 InterceptAround 在我的 Ninject 模块中 在更高级别的代码中 或者在这些方法上使用 InterceptAttribut