无需登录 数据私有 本地保存

依赖注入容器演示 - 理解 IoC 原理

9
0
0
0

依赖注入容器演示

直观理解 IoC 控制反转DI 依赖注入 的核心原理

控制反转 IoC 依赖注入 DI DI 容器 生命周期
模拟容器内部运作 · 可视化依赖解析
容器为空
容器注册表 0 服务

尚未注册任何服务
点击「注册所有预设服务」开始

依赖关系图 箭头 = 依赖方向
UserController ILogger (接口) IUserRepository IEmailService ConsoleLogger UserRepository EmailService

■ 接口/抽象   ■ 具体实现   ■ 目标类   --- 虚线=未注册

实例检查器

解析服务后
在此查看实例信息

容器日志 记录每一步解析操作
容器已就绪,等待操作...
常见问题 FAQ 点击问题展开答案
什么是 IoC 控制反转?
IoC(Inversion of Control,控制反转)是一种设计原则,将对象创建和依赖管理的控制权从程序代码转移给外部容器。传统方式下,类自己负责创建依赖对象(控制权在类内部);而 IoC 将这一控制权"反转"给容器,类只需声明需要什么依赖,由容器统一管理和注入。这样做的好处是降低耦合、提高可测试性、增强灵活性
依赖注入有哪几种方式?
主要有三种:
① 构造函数注入——通过构造函数参数传入依赖(最推荐,依赖不可变);
② 属性注入——通过公开属性设置依赖(灵活但可能遗漏);
③ 方法注入——通过特定方法传入依赖(较少使用)。
本演示使用构造函数注入,因为在对象创建时就能保证所有依赖就绪。
Singleton 和 Transient 的区别?
Singleton(单例):容器中只创建一个实例,后续所有请求都返回同一个实例。适合无状态服务,如日志记录器。
Transient(瞬态):每次请求都创建新实例。适合有状态或需要独立数据的服务。
Scoped(作用域):在一个作用域内共享同一实例(如 Web 请求中)。本演示聚焦 Singleton 和 Transient 的对比。
使用 DI 容器有哪些好处?
解耦:类只依赖接口而非具体实现
可测试:方便替换为 Mock 对象进行单元测试
集中管理:依赖关系在容器中统一配置
生命周期控制:容器管理对象的创建和销毁
减少样板代码:无需手动编写工厂类
常见的 DI 容器有哪些?
.NET:Microsoft.Extensions.DependencyInjection、Autofac、Unity
Java:Spring IoC Container、Guice、Dagger
PHP:Laravel Service Container、Symfony DI
JavaScript/TS:InversifyJS、Awilix、NestJS DI
Python:dependency-injector、inject
不同框架的 DI 容器原理相似,都实现了服务注册、依赖解析、生命周期管理等核心功能。
什么是循环依赖?如何解决?
循环依赖指 A 依赖 B,B 又依赖 A,形成闭环。DI 容器在解析时会陷入无限递归导致栈溢出。
解决方案
① 重构设计,提取公共接口打破循环
② 使用属性注入延迟依赖设置
③ 使用 Lazy<T> 延迟加载
④ 引入中间层(Mediator 模式)
优质 DI 容器通常能自动检测循环依赖并抛出明确的错误信息。