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 #