DI 容器如何工作的最简单解释?

2024-01-12

简单来说和/或在高级伪代码中,DI 容器如何工作以及如何使用?


DI 容器的核心是基于以下内容创建对象:mappings接口和具体类型之间。

这将允许您从容器请求抽象类型:

IFoo f = container.Resolve<IFoo>();

这要求您之前已经配置好的从 IFoo 映射到实现 IFoo 的具体类(例如 Foo)的容器。

这本身并不会特别令人印象深刻,但 DI 容器可以做更多事情:

  • 他们使用自动接线这意味着它们可以自动找出如果 IFoo 映射到 Foo 并且 IBar 映射到 Bar,但 Foo 依赖于 IBar,那么当您请求 IFoo 时,它将创建一个带有 Bar 的 Foo 实例。
  • 他们管理lifetime的组件。您可能每次都需要一个新的 Foo 实例,但在其他情况下您可能需要相同的实例。您甚至可能每次都需要 Foo 的新实例,但注入的 Bar 应保持相同的实例。

一旦您开始尝试手动管理作品 and 寿命你应该开始欣赏 DI 容器提供的服务:)

许多 DI 容器可以做的远不止上述这些,但这些是核心服务。大多数容器都提供以下选项通过代码或 XML 进行配置 https://stackoverflow.com/questions/2512316/ioc-dependency-injection-please-explain-code-versus-xml/2513933#2513933.

当谈到正确的时候usage容器,Krzysztof Kozmic 刚刚发布一个很好的概述 http://devlicio.us/blogs/krzysztof_kozmic/archive/2010/06/20/how-i-use-inversion-of-control-containers.aspx.

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

DI 容器如何工作的最简单解释? 的相关文章

  • 使用 DbContext 接口注册 AspNetCore 2.1 Identity 系统

    我正在开发 Asp Net Core 2 1 Web Api 我在用Microsoft Extensions DependencyInjection AspNetCore Identity and EntityFrameworkCore 在
  • 简单的注入器和内部构造函数

    我正在开发一个小型类库 并为我的 DI 使用简单注入器 类库有一个访问点 我猜是某种服务 它是public它有一些internal服务和存储库 我看到 Simple Injector 不支持使用内部构造函数进行构造函数注入 例如 我的产品服
  • 在非 Angular 类中获取注入的依赖项

    我有当前的 和简化的 课程 export class NavigationItem constructor private router Router navigateTo this router navigate this id 我不想每
  • Dagger @Reusable 范围与 @Singleton

    来自用户手册 http google github io dagger users guide html 有时你想限制 Inject 构造的次数 类已实例化或调用了 Provides 方法 但您没有 需要保证在期间使用完全相同的实例 任何特
  • 在应用程序启动时将实例注册为“单例”bean

    我正在使用 Spring Boot 我正在尝试构建一个实例ServiceImpl时要解决Service是必须的 目前我将实现注释为 Component但这并没有给我机会构建我想要的实例 The ServiceImpl应使用包含磁盘上文件路径
  • Guice 字段注入不起作用(返回 null)

    我在使用 Guice 时遇到空值问题 接下来我将向您展示一个类似场景的示例 我知道字段注入是一种不好的做法 但我希望它在演示中像这样工作 我有一个名为B 这是我要注入的 class B Inject public B public void
  • .Net 6 控制台应用程序:WebApplication.CreateBuilder 与 Host.CreateDefaultBuilder

    我正在研究 NET 6 并希望构建一个简单的控制台应用程序 并进行一些依赖项注入 据我所知 为了使启动 现在只是程序 文件更具可读性 已经做了很多工作 让我有点困惑的是 所有改进似乎都是针对 API 项目中使用的 WebApplicatio
  • 注入需要构造函数参数的服务

    我有一项服务需要启动一些值 Injectable export class MyService private myVals any constructor init any this myVals init 而消费者 Component
  • MEF 错误,是循环依赖,现在是其他错误

    由于我的应用程序架构发生变化 我最近出现了循环依赖关系 该应用程序依赖于通过 MEF 加载插件的插件管理器 一切都工作正常 因为它看起来像这样 model cs Export Model public class Model public
  • 如何在未附加到应用程序模型的类中使用 eclipse 4 DI?

    我创建了一个带有声明性服务的 OSGI 服务来注入实现接口的对象 如果我将对象注入到附加到应用程序模型 处理程序 部分 的类中 它就可以正常工作 如果我将它注入到未附加到应用程序模型的类中 它总是返回 null 是否可以在未附加到应用程序模
  • 有状态对象的 IoC 依赖注入(非全局)

    我是这个 IoC 和 DI 业务的新手 我觉得如果你传递的是全局范围的对象 我就明白了这个概念 但是当你需要传递一个全局范围的对象时 我不明白它是如何工作的特定的逻辑状态 因此 例如 如果我想将一个人对象注入到一个写入文件命令对象中 我如何
  • ASP.NET Core中间件如何进行DI?

    我正在尝试将依赖项注入到我的中间件构造函数中 如下所示 public class CreateCompanyMiddleware private readonly RequestDelegate next private readonly
  • 依赖注入在 C++ 中有用吗

    C uses 依赖注入 DI 很多有一个lossless and testable平台 为此 我需要一个interface也许还有一个DI or 控制反转 IoC 容器为了解决我的情况 但是在 C 中如何做到这一点呢 我读过一些相关内容 似
  • 最终属性 @Value 中的 Spring 属性注入 - Java

    一个关于 Spring 从属性文件注入最终属性的简单问题 我有一个属性文件 我想在其中存储文件路径 通常 当我使用属性文件时 我使用如下内容设置类属性 private Value someProps prop field String so
  • 何时使用接口,何时使用高阶函数?

    给定一个具有以下层的 ASP NET MVC 应用程序 UI 视图 CSS Javascript 等 控制器 服务 包含业务逻辑和数据访问 没有单独的数据访问层的原因是我正在使用 SQL 类型提供程序 以下代码可能不起作用 因为它只是原始草
  • autofac 中的条件组件注册

    是否可以根据其他组件的状态有条件地注册组件 就像是 ContainerBuilder RegisterConditionally
  • 在 ASP.NET Core 的中间件中注入服务

    我想根据 HTTP 标头值注入服务 所以我有 2 个类 DbDataProvider 和 InMemDataProvider 它们都是从 IDataProvider 实现的 每当进行 API 调用时 客户端都会传递一个标头 该标头确定是需要
  • 如何在@FacesConverter中注入@EJB、@PersistenceContext、@Inject、@Autowired等?

    我怎样才能注入像这样的依赖项 EJB PersistenceContext Inject AutoWired等在一个 FacesConverter 在我的具体情况下 我需要通过注入 EJB EJB FacesConverter public
  • 如何使用 ILoggerFactory 记录 Polly 的重试

    或者 如何从静态方法记录 From https github com App vNext Polly https github com App vNext Polly你有这样的例子 其中记录器神奇地可用 Policy Timeout 30
  • asp.net mvc 4 - 可以在每个线程共享 DbContext 吗?

    From 每个 Web 请求一个 DbContext 为什么 https stackoverflow com questions 10585478 one dbcontext per web request why 我的理解是 DbCont

随机推荐

  • 具有自定义哈希函数和比较谓词的 unordered_map 给出编译错误

    我有一个结构作为 std unordered map 的关键 我编写了自定义哈希函数和比较谓词 当我尝试编译代码时 出现以下错误 错误 静态断言失败 键相等谓词必须可以使用两个键类型的参数调用 1831 1831 static assert
  • 支持 .NET Framework 3.5 SP1 客户端配置文件吗?

    针对 NET Framework 3 5 SP1 客户端配置文件时是否需要考虑任何设计注意事项 我知道它是完整框架的子集 但是缺少什么以及我如何知道我的应用程序是否需要客户端配置文件或完整框架 有没有人使用客户配置文件成功开发了一个应用程序
  • 使用 jQuery 将 TD 隐藏到 DIV 中

    我正在尝试隐藏带有所有 TD 的 div 但仅将文本隐藏到 div 中 而不隐藏 TD 标签有人知道如何解决此问题吗 我的代码是 jQuery 代码 div default results hide HTML 代码 div Div Cont
  • 对象检测 API 的 Tensorflow ConcatOp 错误

    我正在遵循tensorflow对象检测api指令并尝试训练现有的对象检测模型 faster rcnn resnet101 coco with 我自己的数据集有 50 个类 所以根据我自己的数据集 我创建了 TFRecord 分别用于训练 评
  • 什么时候需要在 Tkinter 应用程序中调用 mainloop?

    我见过的每个 tkinter 教程都声称tkinter mainloop必须调用该函数来绘制窗口和处理事件 并且它们总是调用此函数 即使在 hello world 程序中也是如此 但是 当我在交互式 shell 中尝试这些时 窗口会正确绘制
  • 在Python中,len(list)有什么作用?

    Does len list 每次调用时计算列表的长度 还是返回内置计数器的值 我有一个上下文 我需要每次通过循环检查列表的长度 例如 listData for value in ioread if len listData gt 25 pr
  • Android 版 Firebase 突然无法在我的测试设备上运行

    我正在使用 Firebase 身份验证和实时数据库构建一个应用程序 昨天之前 在测试时它在我的设备中运行良好 但我现在甚至无法登录 Firebase 但该应用程序可以在我朋友的其他设备上运行 这里的实际问题是什么 在自己的真实设备上测试应用
  • jQuery dataTables:使用 jQuery 在单元格中使用换行符/换行符导出

    我正在尝试使用插件 jquery dataTable 生成可导出的数据表 但出于设计原因 我需要在单元格内进行换行 对于 HTML 视图 我简单地使用 br 但是如果我尝试将这个 f e 导出到 PDF 中 它将导致破坏第一个出现的 br
  • 使用 ReactJS 和 React Router 更改每个路由的页面背景颜色?

    使用 ReactJS 和 React Router 前往新路线时如何更改浏览器背景颜色 请参阅下面我的编辑 了解我一路上想到的想法 我可以让它工作 div 在每个页面视图中 但我需要它在完整背景上工作 以便完整浏览器窗口显示背景 我正在使用
  • 追加后如何检查元素是否存在?

    以下脚本应该附加一个元素 我首先检查该元素是否存在 如果不存在 我将创建它并附加它 问题是 由于某种原因 检查似乎不起作用 它不断地一遍又一遍地创建元素 问题 如何检查append后元素是否存在 我的jsfiddle https jsfid
  • 如何将IntelliJ与本地MySQL连接?

    我一直在努力学习如何在本地主机 MySQL 和 IntelliJ 上连接并编写数据库相关任务 那可能吗 如果是 如何实现 连接到本地实例与连接到远程 MySQL 实例本质上相同 只需将 localhost 或 127 0 0 1 替换为您通
  • firebase 可以 100% 离线运行并稍后同步吗?

    我需要构建一个用于任务工作的应用程序 该应用程序可以 100 离线运行 然后在重新连接到互联网时与服务器同步 该应用程序 目前 的数据库中有超过 6000 人 当传教士在现场时需要对其进行搜索 挑战在于我需要在多台笔记本电脑或平板电脑上本地
  • 将数组转换为对象数组

    如何将数组转换为 JavaScript 对象数组 例如我有一个数组 data fruits frozen fresh rotten apples 884 494 494 oranges 4848 494 4949 kiwi 848 33 3
  • 如何将 System.Data.SQLite 合并到单个可执行程序中?

    我正在尝试用 C 创建一个单一可执行应用程序 其中包括 SQLite System Data SQLite 依赖于一个非托管 DLL SQLite Interop dll 因此我无法将其与 ILMerge 合并 如何将 System Dat
  • 给定图上无向图 BFS 的“邻接矩阵”表示并输出顶点

    我可以在二维数组数组中找到BFS和DFS值 但是得分没有增加 我无法确切地弄清楚我做错了哪一部分 当我打印应该的值时 排序是正确的 但成绩仍然是 0 我对你的想法持开放态度 public class BFS DFS public stati
  • 在haproxy中使用环境变量

    希望有人能指出我正确的方向 我正在尝试将 HAProxy 配置为使用环境变量 来自操作系统 作为 acl 语句的一部分 因此 如果在启动或重新加载 HAProxy 时将环境变量设置为 true 则将授予访问权限 如果环境变量设置为 fals
  • bash 中的日期 - 月份没有前导 0 或空格?

    有人知道如何像这样显示日期吗 7 1 2019 我目前有这个 它在月份中添加前导 0 LC ALL nn NO UTF 8 date d m Y 像这样 7 01 2019 我在 lynx dump 命令中使用这些 您已经删除了当天的填充
  • 如何使用 Twitter Bootstrap 获取居中内容?

    我试图遵循一个非常基本的例子 使用起始页和网格系统 http getbootstrap com css grid 我希望以下内容 div class row div class span12 h1 Bootstrap starter tem
  • 大虾使用pdf模板

    我想用大虾生成一个使用PDF模板的文档 我没有收到任何错误 但模板被完全忽略 有谁知道为什么会这样 我真的很感激任何帮助 class JobPdf lt Prawn Document def initialize job super job
  • DI 容器如何工作的最简单解释?

    简单来说和 或在高级伪代码中 DI 容器如何工作以及如何使用 DI 容器的核心是基于以下内容创建对象 mappings接口和具体类型之间 这将允许您从容器请求抽象类型 IFoo f container Resolve