依赖注入(Dependency Injection,DI)和控制反转(Inversion of Control,IoC)是软件工程中两个相关但不同的概念。它们都旨在提高代码的模块化、可维护性和可测试性,但它们的侧重点和实现方式有所不同。

控制反转(Inversion of Control,IoC)

定义:

控制反转是一种设计原则,它将对象的创建和依赖关系的管理从对象本身转移到外部容器或框架中。简单来说,IoC 是一种思想,它将控制权从应用程序代码中反转到框架或容器中。

核心思想:

  • 传统的编程方式中,对象的创建和依赖关系的管理通常由对象本身负责。例如,一个对象 A 需要使用对象 B,那么对象 A 会直接创建对象 B 的实例。
  • 在 IoC 中,对象的创建和依赖关系的管理被反转,由外部容器或框架来负责。对象 A 不再直接创建对象 B,而是通过容器或框架来获取对象 B 的实例。

举例说明:

假设我们有一个 Car 类,它依赖于 Engine 类。在传统的编程方式中,Car 类可能会直接创建 Engine 类的实例:

public class Car
{
    private Engine _engine;     public Car()
    {
        _engine = new Engine();  // Car 类直接创建 Engine 实例
    }     public void Start()
    {
        _engine.Start();
    }
}

在 IoC 中,Car 类不再直接创建 Engine 实例,而是通过外部容器或框架来获取 Engine 实例:

public class Car {
    private Engine engine;     public Car(Engine engine) {  // 通过构造函数注入 Engine 实例
        this.engine = engine;
    }     public void start() {
        engine.start();
    }
}

在这个例子中,Car 类不再负责创建 Engine 实例,而是通过构造函数从外部获取 Engine 实例。这就是控制反转的思想。

依赖注入(Dependency Injection,DI)

定义:

依赖注入是实现控制反转的一种具体方式。它通过将依赖对象注入到需要它们的对象中,来实现对象之间的解耦。

核心思想:

  • 依赖注入是一种技术,它通过构造函数、属性或方法参数等方式,将依赖对象注入到需要它们的对象中。
  • 依赖注入使得对象之间的依赖关系更加灵活,便于测试和维护。

依赖注入的三种常见方式:

1. 构造函数注入(Constructor Injection)

定义:

构造函数注入是通过构造函数将依赖对象注入到目标对象中。这是最常见和推荐的方式,因为它使得依赖关系在对象创建时明确可见。

特点:

  • 依赖关系在对象创建时被注入。
  • 目标对象的依赖关系在构造函数中声明,使得依赖关系清晰可见。
  • 适用于必须的依赖项。
// 定义接口
public interface IMyDependency
{
    void PerformTask();
} // 实现接口
public class MyDependency : IMyDependency
{
    public void PerformTask()
    {
        Console.WriteLine("Task performed.");
    }
} // 使用构造函数注入
public class MyService
{
    private readonly IMyDependency _myDependency;     public MyService(IMyDependency myDependency)
    {
        _myDependency = myDependency;
    }     public void DoWork()
    {
        _myDependency.PerformTask();
    }
}

2. 属性注入(Setter Injection)

定义:

属性注入是通过属性(或 setter 方法)将依赖对象注入到目标对象中。这种方式适用于可选的依赖项,即目标对象可以在没有依赖项的情况下正常工作。

特点:

  • 依赖关系通过属性或 setter 方法注入。
  • 适用于可选的依赖项。
  • 依赖关系不是在对象创建时注入,而是在对象创建后通过属性设置。
// 定义接口和实现类同上

// 使用属性注入
public class MyService
{
    [Microsoft.Extensions.DependencyInjection.Inject]
    public IMyDependency MyDependency { get; set; }     public void DoWork()
    {
        MyDependency.PerformTask();
    }
}

3. 方法注入(Method Injection)

定义:

方法注入是通过方法参数将依赖对象注入到目标对象中。这种方式适用于依赖关系仅在特定方法中使用的情况。

特点:

  • 依赖关系通过方法参数注入。
  • 适用于依赖关系仅在特定方法中使用的情况。
  • 依赖关系的作用范围仅限于该方法。
// 定义接口和实现类同上

// 使用方法注入
public class MyService
{
    public void DoWork(IMyDependency myDependency)
    {
        myDependency.PerformTask();
    }
}

依赖注入(DI)的优势

使用控制反转(IoC)和依赖注入(DI)的主要好处包括:

  1. 松耦合: 实现对象之间的解耦,提高代码的灵活性。
  2. 可测试性: 通过依赖注入,可以轻松编写单元测试。
  3. 可维护性: 代码更加清晰和易于维护。
  4. 可扩展性: 系统更容易扩展和修改。
  5. 集中管理依赖关系: 依赖关系在应用程序的启动阶段集中配置。
  6. 提高代码的可读性和可理解性: 依赖关系显式声明,减少隐藏依赖。

总结

  • 控制反转(IoC) 是一种设计原则,它将对象的创建和依赖关系的管理从对象本身转移到外部容器或框架中。IoC 是一种思想,它可以通过多种方式实现,包括依赖注入、服务定位器模式等。
  • 依赖注入(DI) 是实现控制反转的一种具体方式,它通过将依赖对象注入到需要它们的对象中,来实现对象之间的解耦。

简单来说,IoC 是一个更广泛的概念,而 DI 是实现 IoC 的一种具体技术。通过使用 IoC 和 DI,我们可以编写更加模块化、可维护和可测试的代码,从而提高软件的质量和开发效率。

控制反转(Inversion of Control,IoC)的更多相关文章

  1. 控制反转Inversion of Control (IoC) 与 依赖注入Dependency Injection (DI)

    控制反转和依赖注入 控制反转和依赖注入是两个密不可分的方法用来分离你应用程序中的依赖性.控制反转Inversion of Control (IoC) 意味着一个对象不会新创建一个对象并依赖着它来完成工 ...

  2. 控制反转 (inversion of control)

    The inversion of control (IoC) pattern is abstract; it says that one should move dependency creation ...

  3. Spring 控制反转容器(Inversion of Control – IOC)

    系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Contro ...

  4. IOC-控制反转(Inversion of Control),也成依赖倒置(Dependency Inversion Principle)

    基本简介 IoC 亦称为 “依赖倒置原理”("Dependency Inversion Principle").差不多所有框架都使用了“倒置注入(Fowler 2004)技巧,这可 ...

  5. 设计模式之————依赖注入(Dependency Injection)与控制反转(Inversion of Controller)

    参考链接: 依赖注入(DI) or 控制反转(IoC) laravel 学习笔记 —— 神奇的服务容器 PHP 依赖注入,从此不再考虑加载顺序 名词解释 IoC(Inversion of Contro ...

  6. Sring控制反转(Inversion of Control,Ioc)也被称为依赖注入(Dependency Injection,DI)原理用反射和代理实现

    首先我有一个数据访问层接口: public interface StudentDao { void save(Student stu); } 和实现类: 1.mysql实现类 public class ...

  7. Spring控制反转与依赖注入(IOC、DI)

    IOC: 反转控制   Inverse Of Control DI:依赖注入 Dependency Injection 目的:完成程序的解耦合 解释:在应用系统的开发过程中,有spring负责对象的创 ...

  8. Spring 什么是 IOC 控制反转 ?什么是依赖注入?spring的用处 好处 为什么要用

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha Spring是一个开源的控制反转(Inversion of Control ,IoC)和 ...

  9. Spring框架系列(3) - 深入浅出Spring核心之控制反转(IOC)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了IoC的基础含义,同时以此发散了一些IoC相关知识点; 本节将在此基础上进一步解读IOC的含义以及IOC的使用方式.@pd ...

  10. 控制反转和spring在项目中可以带来的好处

    Spring实例化Bean的三种方式分别是: 1,xml配置使用bean的类构造器 <bean id="personService" class="cn.servi ...

随机推荐

  1. 从零开始学逆向CTF比赛,免费参加,欢迎来玩!

    大家好,我是轩辕. 告诉大家一个好消息:我准备了一次逆向CTF比赛,面向所有人开放,无需购买课程,优秀的小伙伴还有奖励,参赛方式在文末会介绍,欢迎大家一起来玩. 举办这次CTF比赛,是为了检验大家从零 ...

  2. .net 在线客服系统,到底能不能处理 50万 级消息量,系统架构实践

    业余时间用 .net core 写了一个在线客服系统.我把这款业余时间写的小系统丢在网上,陆续有人找我要私有化版本,我都给了,毕竟软件业的初衷就是免费和分享. 后来我索性就发了一个100%私有化版直接 ...

  3. C++ STL 容器简介

    1.总述 C++ STL(Standard Template Library)是 C++ 标准库的一部分,包括了许多数据结构的实现,提供了许多好用的轮子,同时,其设计思想也非常值得学习.其中,容器是 ...

  4. 在美国和以色列的技术支持下BP机可以爆炸,那么苹果手机是否也可以被远程引爆

    要知道,这一切在技术上都是可以实现的. 由此可见,带电池的产品,最为稳妥的办法就是购买在中国组装的产品,否则其安全性是无法保证的.有人可能会说美国政府不会单独的通过这种方法去定向的杀害某个中国普通人, ...

  5. 佛祖保佑永无 BUG 代码注释

    // // _oo0oo_ // o8888888o // 88" . "88 // (| -_- |) // 0\ = /0 // ___/`---'\___ // .' \\| ...

  6. Ansible自动化管理集群,Playbook语法

    Ansible配置文件存在优先级的问题 ANSIBLE_CONFIG ansible.cfg 项目目录 .ansible.cfg 当前用户的家目录 /etc/ansible/ansible.cfg A ...

  7. manim边学边做--立方体和棱柱体

    本篇介绍Manim中创建三维立体的两个常用对象:Cube和Prism. Cube在制作动画时,可以用于展示立体几何中的立方体概念,或者通过旋转.缩放等动画效果来帮助理解三维空间中的几何变换. Pris ...

  8. QT 6.8 安卓 Android 环境安装配置,你踩了几个坑,我教你跳出来,早看不入坑… …

    安装了QT6.8 最新版本,在线安装,用了数天后,想开始写一个Android程序,发现还在配置环境才可以继续,于是就开始配置: 菜单:编辑 -->preferences-->设备--> ...

  9. docker番外篇-最详细的安装及部署项目教程(net framework,netcore,java,nodejs,静态html,mysql,redis,私有仓库,https免费证书等)

    目录 本地widows(win11)docker环境安装 安装Docker Desktop 服务器liunx(ubuntu)docker环境安装 安装nginx 安装docker环境 安装docker ...

  10. 鸿蒙NEXT开发案例:二维码的生成与识别

    [引言] 在本篇文章中,我们将探讨如何在鸿蒙NEXT平台上实现二维码的生成与识别功能.通过使用ArkUI组件库和相关的媒体库,我们将创建一个简单的应用程序,用户可以生成二维码并扫描识别. [环境准备] ...