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 容器中的自绑定是什么? 的相关文章

  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

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

    您好 我正在寻找创建一个自定义呼叫应用程序 即我想替换默认的应用程序处理调用 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