控制反转(Inversion of Control,IoC)
依赖注入(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)的主要好处包括:
- 松耦合: 实现对象之间的解耦,提高代码的灵活性。
- 可测试性: 通过依赖注入,可以轻松编写单元测试。
- 可维护性: 代码更加清晰和易于维护。
- 可扩展性: 系统更容易扩展和修改。
- 集中管理依赖关系: 依赖关系在应用程序的启动阶段集中配置。
- 提高代码的可读性和可理解性: 依赖关系显式声明,减少隐藏依赖。
总结
- 控制反转(IoC) 是一种设计原则,它将对象的创建和依赖关系的管理从对象本身转移到外部容器或框架中。IoC 是一种思想,它可以通过多种方式实现,包括依赖注入、服务定位器模式等。
- 依赖注入(DI) 是实现控制反转的一种具体方式,它通过将依赖对象注入到需要它们的对象中,来实现对象之间的解耦。
简单来说,IoC 是一个更广泛的概念,而 DI 是实现 IoC 的一种具体技术。通过使用 IoC 和 DI,我们可以编写更加模块化、可维护和可测试的代码,从而提高软件的质量和开发效率。
控制反转(Inversion of Control,IoC)的更多相关文章
- 控制反转Inversion of Control (IoC) 与 依赖注入Dependency Injection (DI)
控制反转和依赖注入 控制反转和依赖注入是两个密不可分的方法用来分离你应用程序中的依赖性.控制反转Inversion of Control (IoC) 意味着一个对象不会新创建一个对象并依赖着它来完成工 ...
- 控制反转 (inversion of control)
The inversion of control (IoC) pattern is abstract; it says that one should move dependency creation ...
- Spring 控制反转容器(Inversion of Control – IOC)
系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Contro ...
- IOC-控制反转(Inversion of Control),也成依赖倒置(Dependency Inversion Principle)
基本简介 IoC 亦称为 “依赖倒置原理”("Dependency Inversion Principle").差不多所有框架都使用了“倒置注入(Fowler 2004)技巧,这可 ...
- 设计模式之————依赖注入(Dependency Injection)与控制反转(Inversion of Controller)
参考链接: 依赖注入(DI) or 控制反转(IoC) laravel 学习笔记 —— 神奇的服务容器 PHP 依赖注入,从此不再考虑加载顺序 名词解释 IoC(Inversion of Contro ...
- Sring控制反转(Inversion of Control,Ioc)也被称为依赖注入(Dependency Injection,DI)原理用反射和代理实现
首先我有一个数据访问层接口: public interface StudentDao { void save(Student stu); } 和实现类: 1.mysql实现类 public class ...
- Spring控制反转与依赖注入(IOC、DI)
IOC: 反转控制 Inverse Of Control DI:依赖注入 Dependency Injection 目的:完成程序的解耦合 解释:在应用系统的开发过程中,有spring负责对象的创 ...
- Spring 什么是 IOC 控制反转 ?什么是依赖注入?spring的用处 好处 为什么要用
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha Spring是一个开源的控制反转(Inversion of Control ,IoC)和 ...
- Spring框架系列(3) - 深入浅出Spring核心之控制反转(IOC)
在Spring基础 - Spring简单例子引入Spring的核心中向你展示了IoC的基础含义,同时以此发散了一些IoC相关知识点; 本节将在此基础上进一步解读IOC的含义以及IOC的使用方式.@pd ...
- 控制反转和spring在项目中可以带来的好处
Spring实例化Bean的三种方式分别是: 1,xml配置使用bean的类构造器 <bean id="personService" class="cn.servi ...
随机推荐
- 利用jupyter进行股票数据分析
1.需求:股票分析 使用tushare包获取某股票的历史行情数据. 输出该股票所有收盘比开盘上涨3%以上的日期. 输出该股票所有开盘比前日收盘跌幅超过2%的日期. 假如我从2010年1月1日开始,每月 ...
- Vue2.x 常用功能和方法
Vue 生命周期 beforeCreate (组件实例刚被创建,组件属性计算之前,如 data 属性等) created (组件实例创建完成, 属性已绑定,但 DOM 还未生成, $el 属性不存在) ...
- Python函数指定参数、返回值类型
def fun(arg1: str, arg2: int ...) -> str: def as_view(name: str, *class_args: int, **class_kwargs ...
- Mac终端zsh设置快捷键的两种方法
vim ~/.zshrc # 第一种 alias test_1='command' # 第二种 function test_2() { command }
- 基于Java+SpringBoot心理测评心理测试系统功能实现五
一.前言介绍: 1.1 项目摘要 心理测评和心理测试系统在当代社会中扮演着越来越重要的角色.随着心理健康问题日益受到重视,心理测评和心理测试系统作为评估个体心理状态.诊断心理问题.制定心理治疗方案的工 ...
- Educational Codeforces Round 90 (Rated for Div2)
Donut Shops 现在有两个超市,第一个超市的物品按件卖,每件商品的售价为\(a\)元:第二个超市的物品按箱卖,每箱有\(b\)件物品,每箱售价为\(c\)元,现在要让你买\(x\)和\(y\) ...
- canvas(三)绘制矩形
1.绘制矩形轨迹 相关语法:ctx.rect(x,y,width,height),根据传入的参数(起始坐标和宽高)用来绘制一个矩形轨迹 注意:ctx.rect()和ctx.lineTo()绘制的都是轨 ...
- 生成式AI如何辅助医药行业智能营销
生成式AI如何辅助医药行业智能营销 生成式AI在医药行业的智能营销中发挥着日益重要的作用,它通过多种方式辅助医药企业提升市场洞察能力.优化营销策略.增强客户互动和体验,从而推动销售增长和品牌价值的提升 ...
- 生产环境BigDecimal用错了,已哭晕在厕所。。。
大家好,我是苏三,又跟大家见面了. 前言 在日常开发中,很多小伙伴喜欢用 BigDecimal 来处理精确计算,比如钱.分数.比例啥的. 理论上,它比 double 或 float 更精确,但如果你用 ...
- HarmonyOS Next 入门实战 - 基础组件、页面实现
基础组件 常用组件 Text:显示文本内容 Image:显示图片 Button:显示一个按钮 Column: 纵向布局 Row:横向布局 List:列表 各组件的用法 Text("文本组件& ...