依赖倒置、控制反转和依赖注入
这里区分以下几个常容易混淆的词:依赖倒置(DIP,DependencyInversion Principle)、控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)。
依赖倒置
著名的好莱坞法则:不要调用我们,我们会调用你。
体现在:高层模块不应依赖于底层模块,二者都应该依赖于抽象。抽象不应该依赖于具体,具体应该依赖于抽象。
控制反转
代码的控制权教友系统,而不是代码内部。主要所在框架开发中,主要类和模块的调用顺序由框架决定,自己所编写的代码也有框架调用(例如:ASP.Net MVC,我们主要编写Model,View和Controler,但具体他们间的调用叫由MVC框架控制)。
依赖注入
依赖注入是客户类依赖服务类的抽象接口,在运行时根据上下文环境,由其他组件(例如DI容器)实例化具体的服务类实例,将其注入到客户端类的运行时环境,实现客户类于服务类实例间松散的耦合关系。
依赖注入例子
常有的依赖注入方式有:接口注入,将对象间的关系转移到一个接口,以接口注入控制。
这里新建类库IServer
,新建类库ServerA
引用类库IServer
,新建控制台DITest
引用类库IServer
。本来控制台DITest
依赖于类库ServerA
,这里运行时动态注入(类库ServerA
生成的dll文件需要放在控制台生产的exe文件夹下)
类库IServer
下新建接口IRunServer
public interface IRunServer
{
void Move();
}
类库ServerA
下新建类
public class CarServer : IRunServer
{
public void Move()
{
Console.WriteLine("汽车在路上驾驶。");
}
}
控制台DITest
下调用
static void Main(string[] args)
{
//可以将其写入配置文件读取
IRunServer run = Assembly.LoadFrom("ServerA.dll").CreateInstance("ServerA.CarServer",false) as IRunServer;
run.Move();
Console.ReadKey();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)