IoC 容器中的自绑定是什么?

2023-12-03

我见过像 Ninject 这样的框架以及 Stack 上的帖子谈到使用依赖注入框架时的自绑定,如下面的代码所示。

Bind<Samurai>().To<Samurai>();

他们甚至为此使用了特殊的语法:

Bind<Samurai>().ToSelf();

为什么要将类型绑定到自身?我没有看到任何实际应用程序可以说明这可能有用并有助于减少代码中的依赖性。这难道不意味着对类型的引用会简单地解析为自身吗?


当应用依赖注入并遵守依赖倒置原则,常见的建议是对接口进行编程,而不是对实现进行编程。这就是为什么大多数时候您会看到从抽象到实现的绑定:

Bind<IWarrior>().To<Samurai>();

这意味着组件depend on IWarrior在编译时,当你inject a Samurai在运行时。

然而,在某些条件下,从具体组件到其自身的映射是有意义的。换句话说,如果“某人”需要Samurai,你提供它Samurai.

最突出的情况是解析根类型时。根类型位于依赖图的顶部;根类型直接从容器解析。所有其他组件都是根类型的直接或间接依赖项。

通常,您会看到这些根类型由其具体类型解析,例如在处理 UI 框架时就会发生这种情况。 Web 表单就是这样的例子Pages, MVC Controllers、Web APIApiControllers, etc.

某些 DI 容器允许无论如何解析具体的未注册类型(尽管近年来一些 .NET 的 DI 容器默认禁用了解析具体未注册类型的功能)。这可能会让您相信自我约束是多余的,但情况并非总是如此。显式添加此类绑定可以让容器知道此类绑定的存在。这样做的优点是可以使用容器的诊断功能(如果存在)来扫描对象图以查找错误。如果缺乏此类功能,通常可以迭代已知的注册并在单元测试中进行一些验证。为了使此类验证在容器的注册被迭代时有意义,所有根类型都需要在容器中注册。否则此验证过程将导致漏报。

您想要告诉 DI 容器有关自绑定的另一个原因是,当您需要使用与容器的默认生活方式不同的生活方式来注册类型时。大多数容器会给你一个短暂的实例,以防类型未注册。

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

IoC 容器中的自绑定是什么? 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • asp.net 文本框文本模式数字,仅允许数字

    我只是想知道 ASP NET 中是否有一种方法只允许文本框中的数字textmode number 当我使用这个时
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用

    我正在尝试将我的项目从 UseMVC asp net core 2 2 兼容样式 升级到 UseEndpoint Routing 并且我的所有请求都被重定向到我的验证失败页面 它与声明有关 如果我删除 Authorize Roles Adm
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 我在在线程序挑战编译器中遇到演示错误

    include
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 创建自定义呼叫处理应用程序

    您好 我正在寻找创建一个自定义呼叫应用程序 即我想替换默认的应用程序处理调用 S 我确定我想重新发明轮子有时当前的轮子对我来说并不好 你能把我放在启动线上吗 我曾经是一位已婚的 M net 开发人员 我爱上了 Google 正如 Emman
  • 在 Zend Framework 2 中访问 MySQL 存储过程输出

    我有一个简单的 MySQL 存储过程 它接受两个参数并向表中插入一行 我可以从 Zend Framework 2 中很好地执行它 如下所示 result this gt dbAdapter gt query CALL sp register
  • 将 STL 与 Alchemy 结合使用

    虽然Alchemy支持编译C 但使用STL似乎很麻烦 主要是由于std string 的问题 奇怪的是炼金术好像用的是GNU libstdc v3 4 6 很难相信 std string 在 GNU 的 STL 中被破坏了 有没有人想出解决
  • C# 如何获取具有时间跨度的音频分贝值

    如何获取每 1 秒的 wav mp3 文件的分贝值 使用任何适用于 C 的音频库 就像是 Time 0 DB 0 213623 Time 1 DB 0 2692261 Time 2 DB 0 2355957 Time 3 DB 0 2363
  • WCF服务客户端:内容类型text/html;响应消息的 charset=utf-8 与绑定的内容类型不匹配

    我的本地 IIS 服务器上正在运行 WCF 服务 我已将其添加为 C 网站项目的服务引用 它添加得很好并自动生成代理类 但是 当我尝试调用任何服务合同时 出现以下错误 描述 期间发生未处理的异常 执行当前的网络请求 请查看堆栈跟踪以了解更多
  • 在 laravel 5.2 中由另一个用户(管理员)注销用户

    假设当前有三个用户从三个设备登录 其中一个用户 管理员 想要强制注销 user2 在 laravel 5 2 中如何实现 数据库表结构 users gt id name email password remember token Updat
  • 按镜像名称删除容器

    我错误地创建了一堆容器 现在我想将其删除 我可以列出它们 docker container ls aq f ancestor portainer portainer 我怎样才能将这些容器ID 管道 到docker container rm
  • xs:unique如何实现到属性中?

    我想在 XML 文件中传递乘客列表中每个属性的唯一性 我的 xml 文件如下所示
  • 如何在android中维护微调器状态[重复]

    这个问题在这里已经有答案了 我正在做一个 Android 应用程序 它可以从网络服务获取数据并将其加载到微调器中 当我进入某个屏幕并返回时 我需要维护微调器的选定数据状态 例如 如果我从网络服务获取数据1 apple 2 orange 3
  • 无法调用非静态方法[重复]

    这个问题在这里已经有答案了 我正在尝试使用这个wavRead filename 但我收到消息cannot make a static reference to a non static method 我可以简单地将其设为静态并解决我的问题
  • iOS防止tableview的子视图随tableview滚动

    我已在表视图中添加了一个子视图 当用户滚动表视图时 子视图也会随之滚动 我该如何防止这种情况 我知道这可能与不将视图添加到表视图的子视图类似 但我不知道有任何其他方法可以做到这一点 谢谢 如果你想让一个视图成为表视图的子视图 那么你可以通过
  • 无法识别的选择器发送到实例

    XCode 再次 让我发疯 人们如何使用这个 UIViewController look for offer unrecognized selector sent to instance 0x4e34220 2011 04 30 18 38
  • 如何检测 Android 上的辅助功能设置是否启用/禁用

    我特别感兴趣high contrast text color correction and magnification设置 我在网上做了一些研究 找不到我想要的 我看到一个关于检测的答案high contrast text Accessib
  • 在 MATLAB 中计算 FFT 图下的面积

    目前 我对一组数据进行了 FFT 得到了 x 轴上的频率和 y 轴上的幅度的图 我想计算图表下方的面积来给我能量 我不确定如何确定面积 因为我没有方程 而且我只想要图的某个区域而不是图下的整个区域 我有办法做到吗 使用 Matlab 进行数
  • jupyter笔记本中没有python终端

    Attached a screenshot of the error I have tried creating python 3 and python2 virtualEnv but nothing is working Any help
  • QThread 不能很好地工作

    这是 QTread 的子对象 并将其具体化在主线程中 运行时错误如下 QCoreApplication sendEvent 中的 ASSERT 失败 无法将事件发送到 不同线程拥有的对象 当前线程 176f0a8 接收者 类型为 MainW
  • 如何配置 WAMP (localhost) 使用 Gmail 发送电子邮件?

    我想使用本地主机的 mail 函数 我安装了 WAMP 并拥有 Gmail 帐户 我知道Gmail的SMTP是smtp gmail com 端口是465 来自 Gmail 的更多信息 我需要在 WAMP 中配置什么才能使用 mail 函数
  • 三星 Galaxy S5 相机手电筒不工作

    我们有一款适用于所有支持的 Android 手机的应用程序 三星 Galaxy S5 除外 我们的应用程序使用相机近距离拍照 在我们集中注意力拍照的整个过程中 我们需要开启手电筒模式 我们检查支持的参数并设置值 如果支持 参数已设置 但事件
  • 使用 gspread 库检查工作簿是否存在?

    如何使用 gspread 库检查工作簿是否存在 我的问题是 如果我第二次运行 gspread create title 它不会重写前一个文件 而是创建另一个同名的文件 有什么办法可以避免它吗 谢谢 石油 你可以检查它尝试 除外 GC ope
  • IoC 容器中的自绑定是什么?

    我见过像 Ninject 这样的框架以及 Stack 上的帖子谈到使用依赖注入框架时的自绑定 如下面的代码所示 Bind