,

IOC & DI

DI(依赖注入 Dependency Injection)是一种实现手段; IOC(控制反转 Inversio…

DI(依赖注入 Dependency Injection)是一种实现手段;

IOC(控制反转 Inversion of Control)是达到的设计思想 / 效果。

一、传统模式:正方向控制(没有 IOC)

定义:对象自己负责创建依赖

假设:ProductService 需要数据库会话 AsyncSession

class ProductService:
    def __init__(self):
        # ❌ 自己内部创建依赖
        self.db = get_session_factory()()

执行流程:

  1. 创建 ProductService
  2. Service 内部主动新建 Session

控制权:Service 主动掌控依赖的创建、生命周期

👉 控制权在业务类内部(正向控制)

缺点:

  1. 强耦合:ProductService 硬编码依赖构造方式,难以单元测试;
  2. 无法灵活替换依赖(测试想传入 mock Session 很难);
  3. 依赖统一管理困难,生命周期分散;

二、IOC 控制反转(Inversion of Control)

反转 = 控制权调换: 业务类不再自己创建依赖,由外部容器创建好依赖,再交给业务类。

业务类只负责使用依赖,不负责制造依赖

控制权转移:

原来:Service → 创建 Session

反转后:外部容器 → 创建 Session → 传给 Service

这就是控制反转 IOC

IOC 是思想,不是代码。如何实现这种反转?最主流方案:DI 依赖注入

三、DI 依赖注入 Dependency Injection

把类所需要的外部依赖,通过外部传入,而不是内部 new。

三种注入方式:

  1. 构造函数注入
  2. 属性注入
  3. 方法注入

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

About the Author

每个人都有自己得时区,在自己得时区里,一切都是准时的。

BlockSpare — News, Magazine and Blog Addons for (Gutenberg) Block Editor