当前位置: 首页 > news >正文

C#摸鱼实录——IoC与DI案例详解

IoC(控制反转)与DI(依赖注入)


开一个新的模块哈,在这个模块里面,我们主要讲一个东西如何使用,尽量不纠结概念,简单过过

之前老是被人说,是不是过于偏向于学院派了,所以从现在开始,我们将只关注能不能用

这个模块里面,我想讲的,大多数是在实际项目中常用的东西,例如一些NuGet 包,一个语法,或者某种设计模式
不过不过多描述概念了,不讲官方那些罗里吧嗦的概念,只需要理解他是什么鬼东西,干什么的,怎么用即可
大抵就是学院派和江湖派的区别吧

顺便后面我要是忘记这个东西怎么用了,还可以回来看看文档,顺便,这就是我未来AI的蒸馏对象我蒸馏我自己

然后,为什么要进行这么古老的学习方式,废话,这年头AI快把初级员工的路堵死了,
不来点古法编程,抽象能力提升很慢的,用了AI几个月,发现初级迈向中级,你不古法编程就等死吧
而且上班摸鱼时间一大把,系统性的学习学习怎么了,打发时间也挺好的,然后深入学习一下IoC的思想

废话少说,进入正题


一.DI依赖注入 — 概念

[!TIP]

如果你不想看文字,或者觉得我这一块讲的不是特别明白的,想看视频教学的话
推荐一位up做的关于依赖注入的教学视频,大概30分钟左右的教学,
只不过后面几个视频初学者容易看不懂
【.Net-依赖注入】从依赖说起_哔哩哔哩_bilibili

很多人可能经常使用依赖注入,但是不知道他叫什么,DI是什么鬼东西,其实看一眼代码就了解了不懂你就再看一眼


1.什么是依赖(Dependency)?

  • 一个对象要工作,需要另一个对象的帮助,没有另一个对象就完成不了

  • /// 因为产品需要零件A,所以产品依赖于零件A /// 即:零件A就是产品的依赖 public class 零件A { public int GetID() => 100; } public class 产品 { private readonly 零件A _a; public 产品(零件A a) => _a = a; }

2.什么是注入(Injection)?

  • 把对象交给另一个对象使用

    • // 通过对象product使用了对象a var a = new 零件A(); var product = new 产品(a);

3.什么是依赖注入(Dependency Injection)?

  • 依赖注入 = 依赖 + 注入

    • 即:对象所需要的依赖由外部提供,而不是自己创建
  • 下面是依赖注入的一点基本概念,结合上面的内容,已经写的非常清楚了,就不再过多阐述

  • // 一个用于示例的空类DbService public interface IDbService { void Insert(); } public class DbService : IDbService { public DbService() { } public void Insert() => Console.WriteLine("====================================="); } /// <summary> /// 传统写法 - 不使用依赖注入(模块之间强依赖,耦合度高) /// </summary> public class NO_DI { // 🌱钱没给够,你自己new吧 private DbService _db = new DbService(); public void Save() => _db.Insert(); } /// <summary> /// 使用依赖注入(松散解耦) /// </summary> public class Yes_DI { private readonly DbService _db; // 🌱钱给够了,直接从外部“注入” public Yes_DI(DbService db) => _db = db; public void Save() => _db.Insert(); } /// <summary> /// 依赖注入常用三种方式(但是基本上还是以构造注入为主) /// </summary> /// <summary> /// 1.1构造注入 /// </summary> public class 构造注入 { private readonly DbService _db; public 构造注入(DbService db) => _db = db; // var a = new A(); // var demo = new 构造注入(a); } /// <summary> /// 1.2.属性注入 /// </summary> public class 属性注入 { public 属性注入() { } public DbService DB { get; set; } = null!; // 属性注入 demo = new 属性注入(); // demo.DB = new DbService(); } /// <summary> /// 1.3.方法注入 /// </summary> public class 方法注入 { public 方法注入() { } public void Execute(DbService db) { } // 方法注入.Execute(new DbService()); }

二.IoC(控制反转)— 概念

1.什么是控制(Control)?

  • 谁决定对象如何产生和使用

    • 控制权:决定某件事情如何进行的权力
      • 在IoC中,特指:创建什么对象,什么时候创建,对象如何创建对象的决定权
      • 看不懂就看下面的例子,一眼秒懂
  • // 产品控制着零件A的创建 // 即:产品拥有创建零件A的控制权 // 缺点,产品和零件A已经绑死了,高度耦合,扩展等死,后人挠头,直骂屎山 public class 零件A { } public class 产品 { private readonly 零件A _a; public 产品() { _a = new 零件A(); } }

2.什么是反转(Inversion)?

  • 反转 = 原来的方向反过来了

    • 原本由A负责的事情,改由B负责
  • 在IoC中通常指:控制权发生变化,由内部控制变成外部控制

  • public class 零件A { } //======================================= // 内部控制 public class 产品 { private readonly 零件A _a; public 产品() { _a = new 零件A(); } } //======================================= // 外部控制 public class 产品 { private readonly 零件A _a; public 产品(零件A a) { _a = a; } }

3.什么是控制反转(Inversion of Control)?

  • 控制方向被反过来了,所以叫控制反转

  • 控制反转:原本由对象自己掌握的控制权,转移给了外部对象或容器

    • 但是需要注意的是,IoC是一种思想,它并不是某种具体的实现
    • 换句话说,DI是IoC的一种实现方式,依赖注入就是使用控制反转的思想
      • 即:依赖注入(DI)是实现IoC最常见的方式之一
  • # 原来:产品内部控制零件A 产品 ↓ # 控制 零件A #==================================================
http://www.jsqmd.com/news/1091759/

相关文章:

  • DLSS Swapper:终极游戏性能优化指南,告别卡顿从版本管理开始
  • 瓶盖视觉检测设备 缺陷刮花划伤黑点外观ccd机器视觉检测
  • ChatGPT付费陷阱预警:这5个“默认优势”其实是营销话术,附官方API成本替代方案
  • DeepEval:高效LLM评估框架的完整实战指南
  • PHP 应用 security.txt 漏洞披露实践
  • python爬虫实战项目|第100篇:爬虫技术全景回顾与未来展望
  • 让经典游戏重获新生:dxwrapper全面解决Windows 10/11兼容性问题
  • 强制访问控制的数学基石:深度拆解BLP机密性模型的设计哲学与工程遗产
  • 终极指南:三步解锁Wand专业版完整功能,告别付费订阅
  • vi 删除指定范围的行,不用再反复按 dd
  • 编写高质量 Skill 系列 -- 如何设计需求分析与用例生成的 SKILL
  • 【2026最新】在 Win11 WSL2 (Ubuntu 24.04) 上搭建 Synopsys VCS/Verdi 2023数字 IC 设计 EDA 工具链
  • 如何在10分钟内解决离线音乐库的歌词同步难题?LRCGET批量歌词下载终极指南
  • Seedance 2.0 做短视频分镜,我最在意的不是“出片”,而是能不能交给团队复用
  • 洛谷 P1854 花店橱窗布置:从 OJ 题解到动态规划实战心法
  • 别再熬夜写论文了!6款AI写作辅助平台,一键生成逻辑连贯初稿!
  • 英雄联盟皮肤资源库技术深度解析:从文件结构到游戏资产管理的终极指南
  • 程序员别再乱堆书签!这个编程合集,让你写代码全程不被打断
  • UART串口环回测试中的校验位实战:从原理到FPGA实现
  • FMEA×控制计划×PPAP自动联动,这才是研发管理的天花板-全星研发项目管理APQP软件系统#APQP #PLM #汽车电子 #芯片研发 #新能源 #项目管理软件
  • 终极指南:如何用PIDtoolbox彻底解决无人机飞行稳定性问题
  • TLS 1.3如何防御中间人攻击:从加密原理到Nginx实战部署
  • Java国密算法实战:SM2/SM3/SM4完整代码示例与Bouncy Castle集成
  • 国内外网站建设选择-主流网站建设工具客观对比(2026年6月最新)含零代码、AI编程、源码定制交付
  • 一次函数图像工厂:用 SymPy 自动生成 y=kx+b 对比动画
  • 慕课助手:打破在线学习效率瓶颈的浏览器插件解决方案
  • CPUDoc深度指南:解锁CPU隐藏性能的5个关键技巧
  • 2026 年深圳远程IO模块选型指南:明达智控MR30系列
  • 循环码编码解码matlab仿真(P124302009 罗睿章, P124302167张国峰)
  • Mi-Create终极指南:零基础打造个性化小米手表表盘