阻止 Ninject 自动绑定 Func

2024-03-04

我有一个优先级队列,它采用函数作为构造函数参数。

public PriorityQueue(ISomeOtherInjectedThing other, Func<T, T, bool> cmp_func) {...}

我使用 Ninject 绑定它:

Bind(typeof (IPriorityQueue<,>)).To(typeof(PriorityQueue<,>));

我们在代码中遇到了一个奇怪的错误,作为其中的一部分,我们注意到 Ninject 似乎生成了一个对象 Func 并将其注入到我们的优先级队列中,但我们没有对此进行绑定。工厂应该抛出一个活动异常,因为我们没有传递所需的比较函数。事实并非如此,如果我调试,我会发现:

Ninject.dll!Ninject.KernelBase.Resolve.AnonymousMethod__c(Ninject.Planning.Bindings.IBinding binding) Line 386 + 0x5a bytes C#

如何让 Ninject 按预期抛出异常,而不是默默生成 Func 来注入?


Func-Auto 与 Func-Factory 的绑定是 Ninject.Extensions.Factory 的一项功能。参见来源:函数模块.cs https://github.com/ninject/ninject.extensions.factory/blob/master/src/Ninject.Extensions.Factory/FuncModule.cs

如果您为以下对象创建特定绑定Func<T, T>它仍然会覆盖由创建的通用绑定FuncModule。但正如您所注意到的,如果您不创建该特定绑定,则不会有任何例外。

摆脱默认(开放)绑定的最简单方法是摆脱 Factory 扩展。

但这可能有点极端。您还可以做的就是禁用自动扩展加载 https://github.com/ninject/ninject/wiki/Modules-and-the-Kernel#ninjectmodule-plugins:

var kernel = new StandardKernel(new NinjectSettings {LoadExtensions = false});

然后你必须动态加载扩展 - 这是通过加载它们来完成的NinjectModule实施。例如:

IKernel.Load<FuncModule>();

当然FuncModule你不想加载,我们正在做这一切来摆脱它。但是您必须为您真正想要的所有其他扩展模块执行此操作。 最后,您必须创建所需的所有工厂扩展绑定:

if (!this.Kernel.GetBindings(typeof(Func<IContext, IResolutionRoot>)).Any())
{
    this.Bind<Func<IContext, IResolutionRoot>>().ToMethod(ctx => context => context.Kernel);
}

this.Bind<FuncProvider>().ToSelf().InSingletonScope();
this.Bind<IFunctionFactory>().To<FunctionFactory>();
this.Bind<IInstanceProvider>().To<StandardInstanceProvider>();

#if !SILVERLIGHT_20 && !WINDOWS_PHONE && !NETCF_35
this.Bind<IInterceptor>().To<FactoryInterceptor>()
    .When(request => typeof(IFactoryProxy).IsAssignableFrom(request.Target.Member.ReflectedType));
#endif

Note: 如果您实际上正在使用 Func-Factories,我建议“忽略”该问题。如果问题再次出现,您现在知道该去哪里查找。 如果这是一个孤立的问题,您也可以更换您的Func<,>通过接口,使事情更加明确(干净的代码)。 当然,无论如何这都不是一个完美的解决方案。这只是人们必须做出的艰难选择之一;-)

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

阻止 Ninject 自动绑定 Func 的相关文章

随机推荐

  • JSF2.0的宽度如何设置?

    代码 div div
  • 单个查询中多个日期范围的总和?

    我有以下查询 SELECT SUM balance transactions fee AS sum id FROM balance transactions JOIN charges ON balance transactions sour
  • Objective-C 插件架构安全性(Mac,不是 iPhone)

    我可能正在为 Cocoa 应用程序 Mac 而不是 iPhone 编写一个插件系统 一种常见的方法是将每个插件打包为一个包 然后将该包注入到主应用程序中 我担心这样做的安全隐患 因为捆绑包将具有对 Objective C 运行时的完全访问权
  • 查找数组中的最小值[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有两个数组 int playerSums 9 string playerNames 9 我正在尝试获取最小值在数组中p
  • 网站的 A/B 测试是什么意思?

    请解释 举例 网站 A B 测试的含义 在网站上下文中 这意味着该网站 网络应用程序的某些用户获得slightly修改版本 并验证与基线 控制 版本相比 每个修改如何影响可用性 用户行为 与往常一样 A B 测试是一种统计技术 您需要足够大
  • 使用哪些 C# AES 加密选项以便可以在公共网站上解密结果? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想使用类似于下面的代码来加密字符串 并能够使用公开网站 例如其中一个网站 对其进行解密 但也对其他一些网站开放 htt
  • 用户窗体工具箱附加控件对话窗口未显示

    在使用 MS Excel 显然还有 Outlook Word 或 Power Point 时 我创建了一个用户表单 工具箱显示控件选项卡和代表各种控件的 16 个图标 当我右键单击工具箱控制区域中的某个空白区域时 会出现一个菜单 其中在顶部
  • 如何存储然后检索父子依赖性数据(Maya MEL/Python 脚本)

    我有一个需要的层次结构 分开 做一点事 按照以前的方式将其重新组装起来 我确实知道如何打破事物 并且对当层次结构扁平时我需要做什么有计划 问题是我如何养育他们 Details 这与我之前的问题有关 冻结带有动画子对象的父对象的缩放变换 MA
  • 在 Android 帐户管理器中存储其他数据

    我想使用安卓AccountManager但是 要同步我的网络服务和应用程序 联系人和日历的标准同步 AccountManager似乎只存储用户名和密码 我的 Web 服务需要三个凭据 用户名 密码和帐户 存储第三条信息的最佳实践是什么 正如
  • JPA - 事务未提交

    我正在开发一个项目 在该项目中我第一次使用 JPA Hibernate 和所有这些东西 但我遇到了事务未提交的问题 我使用类 User 如下所示 package org tomasherman JBTBackup Resource Enti
  • 通过正则表达式限制文本中的行数

    在任何编程语言中 我都知道如何有效地限制给定文件或字符串中的行数 这不是这里的问题 然而在这种情况下 我希望通过正则表达式来做到这一点 在这个模式中我只使用 n 换行符 我不需要其他人 例如 r 回车 n n 0 3 上面的正则表达式解释如
  • 通过 ByteBuffer 和 CQL 3 将 Java 对象序列化到 Cassandra 1.2

    我拼凑了下面的代码 它没有做任何复杂的事情 只是创建一个 byte 变量 将其写入 Cassandra 中的 blob 字段 v1 2 通过新的 Datastax CQL 库 然后将其读回又出来了 当我把它放进去时 它是 3 个元素长 当我
  • @AspectJ 类级别注释建议,以注释作为方法参数

    如何获取注释作为定义的建议的参数传递 类级注释 是否可以 来自帖子here https stackoverflow com questions 2011089 aspectj pointcut for all methods of a cl
  • 如何将 COM 对象包装在本机 .NET 类中?

    我在 NET C 中使用广泛的现有 COM API 可能是 Outlook 但事实并非如此 我通过在 Visual Studio 中添加 COM 引用 来完成此操作 因此所有 魔法 都是在幕后完成的 即 我不必手动运行tlbimp 虽然现在
  • 是否可以在不重新加载页面的情况下检查用户是否在 php 中启用了 cookie?

    例如 即使实际设置了 cookie 下面的代码似乎也不起作用 直到我刷新页面 setcookie cookies 1 time 86400 if isset COOKIE cookies cookies foobar 我试图在我的网站上编写
  • 用户关闭应用程序后,如何恢复上次查看的活动?

    用户关闭应用程序后 我如何恢复上次查看的活动 就像 如果用户打开应用程序 第一个活动将出现 当用户单击按钮时 它将继续到下一个活动 如果他关闭应用程序并再次打开 它仍然会显示上次查看的活动 我该怎么做 请帮我 谢谢你 我认为你应该使用共享首
  • 在 iOS 上使用 PhoneGap/Cordova 和外部 URL

    我希望我的phonegap cordova 应用程序加载外部页面 而不加载任何本地页面 现在我这样做了 但是我的插件 javascript 不起作用 因为它们是从本地index html调用的 在这种情况下我该怎么办 我应该将插件放在外部
  • JPA EntityManager:merge() 正在尝试在数据库中创建新行 - 为什么?

    我通过 Play Framework 使用 JPA 我正在检查 User 对象是否被缓存 如果是 我检索它并 merge 它 以便我可以更新字段并稍后保存更改 user User Cache get user auth sessionAut
  • Intellisense 无法识别 python 3 的类型提示

    我想使用 Visual Studio 并使用类型提示 例如在函数参数列表中 查看智能感知 以确定变量的类型 这可以通过以下方式实现isinstance param type 声明 但我想知道我们是否可以在没有这些附加声明的情况下让它工作 注
  • 阻止 Ninject 自动绑定 Func

    我有一个优先级队列 它采用函数作为构造函数参数 public PriorityQueue ISomeOtherInjectedThing other Func