控制反转(Inversion of Control,IoC)

news/2024/12/23 18:49:31/文章来源:https://www.cnblogs.com/liyongqiang-cc/p/18624782

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

总结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857602.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VXLAN 网络中报文转发过程

以同网段的 VM 间互通简单介绍 VXLAN 网络中的报文转发过程。本文分享自天翼云开发者社区《VXLAN 网络中报文转发过程》,作者:刘****林 以同网段的 VM 间互通简单介绍 VXLAN 网络中的报文转发过程。1.VM1 发送目的地址为 VM2 的报文。 2.VTEP1 收到该报文后进行 VXLAN 封装,…

【YashanDB知识库】YMP迁移过程中报错YAS-02143或YAS-02193

本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7802944.html?templateId=1718516 【标题】YMP迁移过程中报错account lock 【关键字】YMP 迁移 account lock openssl 【问题描述】YMP所在机器的openssl版本低于1.1.1,在安装YMP及内置库时使用了…

js侧边栏菜单插件canvi

canvi.js是一款js侧边栏菜单插件。canvi.js使用简单,可以快速的制作出侧边栏展开收缩js特效。你可以在同一个页面实例化多个侧边栏实例,还可以设置侧边栏的响应式宽度,自定义侧边栏样式等。在线预览 下载使用方法 在页面中引入canvi.css和canvi.js文件。< link rel=&qu…

GitHub主页3D图表显示

效果如图,项目来源于 yoshi389111/github-profile-3d-contrib: This GitHub Action creates a GitHub contribution calendar on a 3D profile image. 1. 创建自己的github主页属性项目——跟你github用户名一致即可, 比如我github名字叫FlameskyDexive, 创建一个FlameskyDe…

E. Expression Correction

链接:https://codeforces.com/contest/2052/problem/E 题目:思路: 一道模拟。重点在于:移动每个数字;判断是否成立。 问题一:选中每个数码,枚举需要移动到的位置,使用swap函数。 问题二:格式问题+算术问题。不能有前导0,不能两个非数字相连,同时位数不能超过十位,首位和…

zabbix外部程序告警关键配置

环境: OS:Centos 7 zabbix:4.0.51.主机配置 2.用户配置 3.用户组配置 4.动作配置 5.脚本需要加上执行权限chown +x 脚本

Java项目实战之基于 Spring Boot、MyBatis 和 Vue.js 的智能停车场系统设计与技术选型

1. 系统概述 本智能停车场系统旨在为停车场提供高效、便捷的管理解决方案,涵盖车辆进出管理、车位预订、停车费用计算、用户信息管理等功能,同时提供管理员操作界面和用户移动端应用,提升停车场运营效率和用户体验。 1.1目标 实现停车场自动化管理,提高车位利用率,减少人工…

vmagent如何快速采集和转发Metrics

vmagent如何快速采集和转发Metrics本文介绍了vmagent的设计细节,参考自:vmagent-how-it-worksVictoriaMetrics agent是一个轻量级工具,用于采集不同源的指标。vmagent可以在转发指标前(通过"relabeling")定制指标(降低基数、流聚合、去重等)。第一步:通过API或抓…

SwiftUI 2024 All In One

SwiftUI 2024 All In OneSwiftUI 2024 All In OneWWDC24 SwiftUI & UI Frameworks guidehttps://developer.apple.com/news/?id=zqzlvxlm demos Design and build your apps like never before. 以前所未有的方式设计和构建您的应用程序。 With enhancements to live prev…

IGM机器人K5齿轮箱维修故障详情介绍

在长期、高强度的工作中,IGM机器人K5齿轮箱难免会出现故障,需要联系子锐机器人维修进行及时的维修和保养。 一、齿轮磨损 齿轮磨损是IGM机器人K5齿轮箱最常见的故障之一。长时间、高速运转以及负载的频繁变化都会导致齿轮表面的磨损。磨损的齿轮会降低传动效率,产生噪音,甚…